Home » Tipps & Tricks » Komponenten » TStrings » Text mit einem FindDialog suchen
Text mit einem FindDialog suchen
Die Komponente TFindDialog von Delphi stellt dem Anwender einen Standard-Dialog zum Durchsuchen von Texten zur Verfügung. Dieser Artikel zeigt, wie Sie den Text eines TMemo-Feldes durchsuchen. Es werden die Optionen „Groß/Kleinschreibung“ und „Ganze Wörter suchen“ berücksichtigt. Die Suche beginnt stets an der Stelle des Cursor. Wird ein Suchbegriff gefunden, wird dieser im Text selektiert.Schreiben Sie in das OnFind-Ereignis des TFindDialogs folgendes:
procedure TForm1.FindDialog1Find(Sender: TObject); const TWordSeperators: set of Char = ['A'..'Z', 'a'..'z', 'ö', 'Ö', 'Ä', 'ä', 'ü', 'Ü', 'ß', '´', '`', '@', ' _', '0'..'9']; var Buffer: String; CmpText: String; Position: Integer; Counter: Integer; Left, Right: Boolean; Hit: Boolean; begin if not (frMatchCase in Finddialog1.Options) then begin CmpText:=AnsiUpperCase(Finddialog1.FindText); Buffer := AnsiUpperCase(Copy(Memo1.Text, Memo1.SelStart+Memo1.SelLength+1, Length(Memo1.Text))) end else begin CmpText := Finddialog1.FindText; Buffer:=Copy(Memo1.Text,Memo1.SelStart+Memo1.SelLength+1,Length(Memo1.Text)); end; Position:=AnsiPos(CmpText, Buffer); if Position > 0 then begin if frWholeWord in FindDialog1.Options then begin Counter:=0; Position:=AnsiPos(CmpText, Buffer); Hit:=False; while (Position > 0) and not Hit do begin Left:=(Position = 1) or (not (Buffer[Position-1] in TWordSeperators)); Right:=(Position+Length(Finddialog1.FindText) >= Length(Buffer)) or (not (Buffer[Position+Length(Finddialog1.FindText)] in TWordSeperators)); Hit:=Left and Right; Inc(Counter, Position); Delete(Buffer, 1, Position); Position:=Pos(CmpText, Buffer); end; if Hit then begin Memo1.SelStart:= Memo1.SelStart+Memo1.SelLength+Counter-1; Memo1.SelLength:= Length(Finddialog1.FindText); end else FindDialog1.CloseDialog; end else begin Memo1.SelStart:= Memo1.SelStart+Memo1.SelLength+Position-1; Memo1.SelLength:= Length(Finddialog1.FindText); end; end else FindDialog1.CloseDialog; Memo1.SetFocus; end;
Der FindDialog wird folgendermaßen geöffnet:
procedure TForm1.Button1Click(Sender: TObject); begin FindDialog1.Execute; end;