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

Soyez le premier à donner votre avis sur cette source.

Vue 12 093 fois - Téléchargée 674 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

crazyjoke
Messages postés
147
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
9 janvier 2005
-
Merci pour ce code qui peut être très utile lors de la création d'application dans lesquelles l'utilisateur doit taper beaucoup de texte (en + sa fait Pro :-)).

@++
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
Extrait de l'aide en ligne de Delphi :
"Utilisez CaretPos pour déterminer les coordonnées du curseur. Le type TPoint définit un emplacement sur l'écran exprimé en pixels, l'origine étant l'angle supérieur gauche. X spécifie la coordonnée horizontale du point et Y la coordonnée verticale. CaretPos indique la position X et Y relative à l'origine client du mémo.

Afin de déterminer la position du signe insertion en termes de caractères de texte uniquement (plutôt qu'en emplacement X/Y), utilisez la propriété SelStart."

Si les autres codes sources utilisent les messages Windows, ce n'est pas pour se faire plaisir mais pour obtenir directement les coordonnées du curseur en ligne et colonnes de Texte au lieu de les obtenir en coordonnées graphiques.
cs_bazole
Messages postés
40
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005
-
Salut Delphiprog

Pourtant, si tu fait le test, tu verra que l'on obtient bien le numéro de ligne et de colonne du curseur.
cs_bazole
Messages postés
40
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005
-
Je rajoute un petit fichier zip pour le test.
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
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.