POSITION DU CURSEUR ( LIGNE ET COLONNE ) DANS UN MEMO OU UN RICHEDIT

Utilisateur anonyme - 8 juil. 2003 à 12:27
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009 - 27 déc. 2011 à 15:46
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12644-position-du-curseur-ligne-et-colonne-dans-un-memo-ou-un-richedit

ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
27 déc. 2011 à 15:46
ffert Messages postés 63 Date d'inscription samedi 18 janvier 2003 Statut Membre Dernière intervention 15 décembre 2009
27 déc. 2011 à 15:26
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
27 déc. 2011 à 14:59
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
29 juil. 2003 à 21:55
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 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
29 juil. 2003 à 09:54
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.
cs_bazole Messages postés 37 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 13 novembre 2005
28 juil. 2003 à 22:59
Je rajoute un petit fichier zip pour le test.
cs_bazole Messages postés 37 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 13 novembre 2005
28 juil. 2003 à 19:43
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_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 juil. 2003 à 23:49
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.
Utilisateur anonyme
8 juil. 2003 à 12:27
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 :-)).

@++
Rejoignez-nous