Scroller pour afficher la ligne contenant le string choisi

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 22 sept. 2009 à 22:15
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 25 sept. 2009 à 15:41
Salut,
J'ouvre un memo et y affiche le contenu d'un fichier.
Je souhaite que le memo scrolle jusqu'à la ligne contenant un string envoyé à la procédure.
Quel procedure utiliser dans memo?
Merci pour votre aide!!!
Phil.
A voir également:

6 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 sept. 2009 à 08:45
Tu peux utiliser Memo1.ScrollBy(DeltaX, DeltaY: Integer) pour scroller dans ton mémo. Après, un rapide calcul nombre de lignes (Memo1.Lines.Count) * hauteur (il y a une fonction mais j'ai oublié le nom) d'une ligne te donnera la position de la ligne dans le memo je pense ... Pour trouver la ligne qui contient le string envoyé à la procédure, tu peux par exemple boucler sur chaque ligne, et tester avec un Pos(LigneEnCours, StringRecherché)

Cordialement, Bacterius !
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
23 sept. 2009 à 14:27
Extrait de l'aide de Delphi

SetFocus, SelStart, SelLength, exemple

Le gestionnaire d'événement OnFind suivant recherche dans un composant mémo le texte spécifié dans la propriété FindText d'un composant boîte de dialogue de recherche. S'il est trouvé, la première occurrence du texte dans Memo1 est sélectionnée. Le code utilise la fonction Pos pour comparer les chaînes et enregistrer le nombre de caractères à sauter lors de la détermination de la position de sélection dans la variable SkipChars. Comme il n'y a pas de gestion des majuscules/minuscules, des mots entiers ou de direction de recherche dans cet algorithme, il est supposé que la propriété Options de FindDialog1 était initialisée à [frHideMatchCase, frHideWholeWord, frHideUpDown].

procedure TForm1.FindDialog1Find(Sender: TObject);

var
  I, J, PosReturn, SkipChars: Integer;
begin
  for I := 0 to Memo1.Lines.Count do
  begin
    PosReturn := Pos(FindDialog1.FindText,Memo1.Lines[I]);
    if PosReturn <> 0 then {found!}
    begin
      SkipChars := 0;
      for J := 0 to I - 1 do
        SkipChars := SkipChars + Length(Memo1.Lines[J]);
      SkipChars := SkipChars + (I*2);
      SkipChars := SkipChars + PosReturn - 1;

      Memo1.SetFocus;
      Memo1.SelStart := SkipChars;
      Memo1.SelLength := Length(FindDialog1.FindText);
      Break;
    end;
  end;

end;

Ken@vo
Code, Code, Codec !
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 sept. 2009 à 14:55
Salut à tous,

@Kenavo:
quel plaisir de te lire et te voir à nouveau sur Delphifr

moi je propose une méthode totalement différente qui est bien pratique pour se déplacer dans un Memo/RichEdit par ligne et colonne:
[hr]procedure SetCaretPos(aHandle : THandle; Value: TPoint);

[b]var
  /bCharIdx: Integer;
[b]begin
  /bSetFocus(aHandle);
  CharIdx :=  SendMessage(aHandle, EM_LINEINDEX, Value.y, 0) + Value.x;
  SendMessage(aHandle, EM_SETSEL, CharIdx, CharIdx);
end ;

procedure TForm1.Button5Click(Sender: TObject);
[b]var
  /bpt: TPoint;
[b]begin
  /bpt.X : = 10;   // Colonne (-1)
  pt.Y : = 141; // Ligne (-1)
  {Le premier caractère à la première ligne == 0,0}
  SetCaretPos(memo1.Handle , pt);
  Memo1.Perform(EM_SCROLLCARET, 0, 0);
end;
[hr]
j'avais aussi essayé avec Memo.CaretPos mais sans succès.

[hr]@+Cirec
[hr]
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
23 sept. 2009 à 21:01
Merci pour vos propositions,
Je teste et publie THE best one!
A+
PhilLu

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
23 sept. 2009 à 21:33
J'ai testé le code de Kenavo:

NOK!

Je pense qu'il manque un begin ... après le "do" mais le "end;" après le break ne donne rien de mieux?!?
Le memo n'affiche pas (ne scrolle pas) la ligne recherchée!
Help!
PhilLu.

begin
SkipChars := 0;
for J := 0 to I - 1 do
{begin?}
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1;
Memo1.SetFocus;
Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(FindDialog1.FindText);
Break;
{end?}
end;
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
25 sept. 2009 à 15:41
Salut à tous,

Une énigme:

Copier
coller
Copier
coller
Copier
coller
Copier
coller

Devinez ce que fait ce programme?
Réponse: il vous responsable malgré votre irresponsabilité.

A+
Rejoignez-nous