bonjour à tous!
je voudrai savoir comment obtenir le n° de ligne d'une chaîne de caractère spécefique sur un mémo.
merci d'avance
bonjour à tous!
je voudrai savoir comment obtenir le n° de ligne d'une chaîne de caractère spécefique sur un mémo.
merci d'avance
Salut !
Compte tenu de ma version BCB et s'agissant d'un TMemo...
Pour la saisie, il existe CaretPos (à exloiter dans la OnKeyUp du Memo).
Idem si celà concerne la sélection d'un mot à l'aide de la souris (à exploiter dans la OnMouseDown ou OnMouseUp du Memo).
Si cela concerne une recherche dynamique d'un mot, on peut le faire, à l'aide d'une boucle, donc chaine par chaîne, en utilisant la méthode AnsiString::Pos.
La ligne est alors donnée par la boucle; le mot est trouvé lorsque Pos renvoie un résultat différent de 0.
Il faudra ruser un peu s'il faut tenir compte ou non, de la casse (case sensitive).
A plus !
merci pour l'aide que vous m'apporter.
Salut !
Voici un bout de code pour appliquer ce que j'ai mentionné.
J'ai donc utilisé un TMemo, un TStatusBar (avec 4 panels), un TSpeedButton et un TFindDialog.
Le TSpeedButton sert à ouvrir le TFindDialog.
La recherche d'un mot s'effectue depuis ce TFindDialog.
Déclarations globales (ou comme propriétés de TForm1 ou autre):
a) Pour la saisie avec indication de la position du caret :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int Start; bool MatchCaseOption;
b) Pour la recherche d'un mot :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void __fastcall TForm1::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { StatusBar1->Panels->Items[0]->Text = Memo1->CaretPos.x; StatusBar1->Panels->Items[1]->Text = Memo1->CaretPos.y; } void __fastcall TForm1::Memo1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { StatusBar1->Panels->Items[0]->Text = Memo1->CaretPos.x; StatusBar1->Panels->Items[1]->Text = Memo1->CaretPos.y; }
Cette méthode est celle de l'événement OnFind qui se produit à chaque fois que l'on va cliquer sur Suivant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { //Initialisation des paramètres Start = 0; MatchCaseOption = FindDialog1->Options.Contains(frMatchCase); //Ouverture de la boite de dialogue FindDialog1->Execute(); }
Ce n'est qu'un exemple !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 void __fastcall TForm1::FindDialog1Find(TObject *Sender) { AnsiString N; //Cette partie ne sert qu'à vérifier si on a modifié l'option MatchCase //Si c'est le cas, on reprend la recherche depuis la première ligne bool CaseSensitive = FindDialog1->Options.Contains(frMatchCase); if(MatchCaseOption != CaseSensitive) { Start = 0; MatchCaseOption = CaseSensitive; } AnsiString F = FindDialog1->FindText; //Si on ne tient pas compte de la casse dans ce cas on travaille en UpperCase if(CaseSensitive == false) F = F.UpperCase(); for(int j = Start; j < Memo1->Lines->Count; j++) { N = Memo1->Lines->Strings[j]; if(CaseSensitive == false) N = N.UpperCase(); if(N.Pos(F) != 0) { StatusBar1->Panels->Items[2]->Text = j; Start = j+1; //prêt pour la ligne suivante return; //fin puisque l'on a trouvé une ligne } } }
A noter qu'ici je ne recherche qu'une seule occurence par ligne.
A plus !
mon travaille consiste a faire renter un programme sur le memo(après l'exécution du code)et trouver la chaîne que je veut à partir d'un n° de ligne pour ensuite incrémenter ce n° et continuer la procédure.
sans mettre les composants StatusBar et un FindDialoque.
Partager