Position du curseur ( ligne et colonne ) dans un memo ou un richedit

Soyez le premier à donner votre avis sur cette source.

Vue 12 224 fois - Téléchargée 677 fois

Description

Mon premier code tout simple pour débutant.

Affiche la position du curseur (ligne et colonne) dans le Panel d'un StatusBar
Pour Memo ou RichEdit.
j'ai vu ça dans le forum mais avec l'utilisation de messages Windows.
Pourtant ces 2 composants possèdent la propriété "CaretPos" pour le faire simplement.

Exemple avec un RichEdit.

Petite modif : suite à un conseil de Delphiprog (voir commentaire ci-dessous), je retire l'argument 'Sender' dans le code ci-dessous.

Dans le zip, j'y ai mis le code fourni par Delphiprog que j'ai essayé de commenter, tant bien que mal, pour les débutants.

Source / Exemple :


procedure TForm1.PosCurseur;
var
  ligne, colonne : integer;
  Affichage : string;
begin
  //Récupère la position de la colonne
  colonne := RichEdit1.CaretPos.X + 1 ;

  //Récupère la position de la ligne
  ligne := RichEdit1.CaretPos.Y + 1 ;

  //Ajoute le texte "lig" et "col" pour l'affichage dans le Panel d'un StatusBar
  Affichage := 'Lig ' + IntToStr(ligne) + ' : Col ' +  IntToStr(colonne);

  //Affiche le texte finale dans le Panel d'un StatusBar
  StatusBar1.Panels.Items[0].Text := Affichage;
end;

Conclusion :


Placer le code ou son appel dans l'événement :
OnSelectionChange pour un RichEdit
OnClick et OnKeyUp pour un Memo
(pour chaque déplacement du curseur).

et dans l'événement OnShow de Tform1
(pour faire apparaître les numéros de ligne et colonne au démarage du prog).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

La bonne réponse est :

var
Ligne : integer; // numéro de la ligne ou se trouve le curseur
begin

// position du curseur (+ 1 : première ligne = 0)
Ligne := 1 + SendMessage(Memo1.Handle, EM_LINEFROMCHAR, Memo1.SelStart, 0);

end;
ffert
Messages postés
63
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
15 décembre 2009

problème... sur un Tmemo contenant 130000 lignes...
la position Y est toujours comprise entre 0 et 983 y compris si je me trouve à la 80 000 ème ligne....

comment obtenir la vraie position ???

merci
cs_bazole
Messages postés
37
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005

Merci Delphiprog pour la correction et à l'amélioration de ce code.

J'ai apporté les modifications nécessaires dans le code affiché.

Dans le zip j'y ai mis ton code en modifiant les noms des arguments, qui sont trop proche des noms de composants existants (risque de confusion pour les débutants).

et merci aussi à crazyjoke pour son commentaire.
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
26
Tu as effectivement raison et l'aide en ligne au sujet de la propriété CaretPos est donc erronnée.
Remarque : lors de la création de la fiche, tu passes à PosCurseur le paramètre Sender reçu par la méthode Create. C'est dangereux et heureusement que tu ne l'utilises pas dans ta procédure.

Suggestions :
procedure PosCurseur(Memo: TCustomMemo; Panel: TStatusPanel);
var
ligne, colonne : integer;
Affichage : string;
begin
//Récupère la position de la colonne
colonne := Memo.CaretPos.X + 1 ;

//Récupère la position de la ligne
ligne := Memo.CaretPos.Y + 1 ;

//Ajoute le texte "lig" et "col" pour l'affichage dans le Panel d'un StatusBar
Affichage := 'Lig ' + IntToStr(ligne) + ' : Col ' + IntToStr(colonne);

//Affiche le texte finale dans le Panel d'un StatusBar
Panel.Text := Affichage;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
PosCurseur(RichEdit1, StatusBar1.Panels.Items[0]);
end;

procedure TForm1.RichEdit1SelectionChange(Sender: TObject);
begin
PosCurseur(Sender as TCustomMemo, StatusBar1.Panels.Items[0]);
end;

Ceci permet de rendre la procédure PosCurseur indépendante, facilement réutilisable et de ne pas lui passer n'importe quoi comme arguments. En transmettant un TCustomMemo comme premier argument, tu couvres donc aussi bien le TMemo que le type TRichEdit puisqu'il s'agit de leur ancêtre commun.

En tous cas, merci de ne nous avoir révélé cette astuce.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.