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;