2010-11-20 8 views
6

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

3
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.

+0

La recherche dans 'TStrings.Text' plutôt que dans' TStrings.Strings' coûte très cher. 2 × N dans le fait. –

+0

@ 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

+0

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

11

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.

+0

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

+0

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

+2

GolezTrol: Merci pour l'astuce HideSelection! – RobertFrank

Questions connexes