Quelqu'un peut-il me donner un code simple qui me donnerait la possibilité de rechercher une chaîne simple dans un mémo et de le mettre en surbrillance dans le mémo après avoir été trouvé?Rechercher par un mémo dans Delphi?
Répondre
function TForm1.FindText(const aPatternToFind: String):Boolean;
var
p: Integer;
begin
p := pos(aPatternToFind, Memo1.Text);
Result := (p > 0);
if Result then
begin
Memo1.SelStart := p;
Memo1.SelLength := Length(aPatternToFind);
Memo1.SetFocus; // necessary so highlight is visible
end;
end;
Ceci ne recherche PAS entre les lignes si WordWrap est vrai.
Cette recherche permet l'insertion de documents, la recherche sensible à la casse et la recherche à partir de la position du curseur.
type
TSearchOption = (soIgnoreCase, soFromStart, soWrap);
TSearchOptions = set of TSearchOption;
function SearchText(
Control: TCustomEdit;
Search: string;
SearchOptions: TSearchOptions): Boolean;
var
Text: string;
Index: Integer;
begin
if soIgnoreCase in SearchOptions then
begin
Search := UpperCase(Search);
Text := UpperCase(Control.Text);
end
else
Text := Control.Text;
Index := 0;
if not (soFromStart in SearchOptions) then
Index := PosEx(Search, Text,
Control.SelStart + Control.SelLength + 1);
if (Index = 0) and
((soFromStart in SearchOptions) or
(soWrap in SearchOptions)) then
Index := PosEx(Search, Text, 1);
Result := Index > 0;
if Result then
begin
Control.SelStart := Index - 1;
Control.SelLength := Length(Search);
end;
end;
Vous pouvez définir HideSelection = False sur la note de service pour afficher la sélection même si la note ne se concentre pas.
Utilisez comme ceci:
SearchText(Memo1, Edit1.Text, []);
Permet la recherche des modifications aussi bien.
L'utilisation de UpperCase peut ne pas vous donner les résultats souhaités, par ex. en français, les caractères majuscules ne peuvent pas avoir d'accent, alors que les caractères minuscules peuvent en avoir un (c'est différent du français canadien, je crois, où les caractères majuscules peuvent aussi être accentués). Donc, dans ce cas, l'utilisation de LowerCase donnerait de meilleurs résultats. – dummzeuch
Eh bien, la lettre accentuée et la lettre non accentuée sont deux lettres différentes, n'est-ce pas? Un mot français, lorsqu'il est converti en UpperCase, apparaîtra comme PRIVé, en minuscule il sera privé. D'un autre côté, la lettre majuscule É n'est pas non plus convertie en é, donc je ne vois pas comment cela affectera les résultats de la recherche. Bien que je dois admettre que je suis en train de tester cela dans Delphi 7. Si unicode ou l'utilisation possible des paramètres régionaux dans votre Delphi donne de meilleurs résultats lors de l'utilisation de LowerCase, s'il vous plaît faire. – GolezTrol
GolezTrol: Merci pour l'astuce HideSelection! – RobertFrank
La recherche dans 'TStrings.Text' plutôt que dans' TStrings.Strings' coûte très cher. 2 × N dans le fait. –
@ user205376 - Pourquoi dites-vous cela? TStrings.Text est une chaîne unique sur laquelle je pense que pos() serait rapide. La recherche, comme vous le suggérez, TStrings.Strings impliquerait des indices pour accéder à chaque chaîne. Cela, IMO, opinion, serait plus lent et ne fournirait aucune fonctionnalité supplémentaire que le pos() ne fait pas. (Et, il faudrait un code délicat pour mettre en évidence le motif trouvé) Pourquoi pensez-vous pas? – RobertFrank
Un peu en retard au jeu, mais pour ce qui précède, cela dépend de l'implémentation. Après tout, TStrings est abstrait. Memo.Lines.Text (= TMemoStrings.Text) obtient le texte du mémo en utilisant un seul appel d'API, tandis qu'un TStringList stocke une chaîne distincte et TStringList.Text les combine en une seule chaîne sur chaque requête (qui est souvent encore plus rapide que l'appel l'API, btw). La réponse utilise Memo1.Text qui, je pense, contourne tout descendant de TStrings et appelle directement une API de GetText sur la poignée du mémo. – GolezTrol