Sign in Join
Wiki copytemporary

Revision 1 of 2, by TyphonFinger on 5-1-2020. The page as it is now.

TFindDialog

TFindDialog is a component that aids in searching information. It can be found on the Dialogs tab of the Component Palette.

It is important to know that the dialog itself does not perform a search; it just provides a user interface for all the search parameters. To activate a FindDialog, call its Execute() function. Create an OnFind method in which the search itself is performed.

<figure> <img src="component-TFindDialog.png" title="component-TFindDialog.png" /> <figcaption>component-TFindDialog.png</figcaption> </figure>

Usage

The following examples illustrate usage of TFindDialog for search a specific phrase within the text stored in a memo (TMemo).

pascal
procedure TForm1.Button1Click(Sender: TObject);
begin
  FindDialog1.Execute();
end;

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  k: integer;
begin
  with Sender as TFindDialog do begin
    k := Pos(FindText, Memo1.Lines.Text);
    if k > 0 then begin
      Memo1.SelStart := k - 1;
      Memo1.SelLength := Length(FindText);
      Memo1.SetFocus; // Memo1 must be activated, otherwise the selection effect will not be displayed
    end else
      Beep();
  end;
end;

If you want to repeat the operation several times with the same search text you must remember the last found position and continue searching from here - the function PosEx() in unit StrUtils is perfect for this purpose:

pascal
uses
  StrUtils;

type
  TForm1 = class(TForm)
  private
    FFoundPos: Integer;
    ...

procedure TForm1.Button1Click(Sender: TObject);
begin
  with FindDialog1 do 
  begin
    if frEntireScope in Options then    // Search begins at file start
      FFoundPos := 0
    else
      FFoundPos := Memo1.SelStart;      // Serach begins at current cursor position
    Execute;
  end;
end; 

procedure TForm1.FindDialog1Find(Sender: TObject);
begin
  with Sender as TFindDialog do 
  begin
    FFoundPos := PosEx(FindText, Memo1.Lines.Text, FFoundPos+1);
    if FFoundPos > 0 then 
    begin
      Memo1.SelStart := FFoundPos - 1;
      Memo1.SelLength := Length(FindText);
      Memo1.SetFocus; // Memo1 must be activated, otherwise the selection effect will not be displayed
    end else
      Beep();
  end;
end;

See also


From the Free Pascal wiki, page "TFindDialog", as it stood on 2020-05-01 after a change by TyphonFinger, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.