Table of Contents

Search Dialog Workflow

TTMSFNCFindDialog displays a reusable search dialog with history, direction, matching options, and command buttons. The dialog reports search requests through events so the application keeps control over the actual search algorithm.

Configure Search State

Use FindText for the initial search value and FindList for reusable history. Enable AutoHistory when the dialog should append successful search text automatically.

TMSFNCFindDialog1.FindText := 'customer';
TMSFNCFindDialog1.FindList.Clear;
TMSFNCFindDialog1.FindList.Add('customer');
TMSFNCFindDialog1.FindList.Add('invoice');
TMSFNCFindDialog1.AutoHistory := True;
TMSFNCFindDialog1.Options := TMSFNCFindDialog1.Options + [fdoCaseSensitive, fdoCloseIfFound];
TMSFNCFindDialog1.OnFind := TMSFNCFindDialog1Find;
TMSFNCFindDialog1.OnFindNext := TMSFNCFindDialog1FindNext;
TMSFNCFindDialog1.Execute;

Handle Find Events

Handle OnFind and OnFindNext to run the search. Set AFound to True when a match was found; if fdoCloseIfFound is enabled, the dialog can close automatically after a successful search.

procedure TForm1.TMSFNCFindDialog1Find(Sender: TObject; AFindText: string; var AFound: Boolean);
begin
  AFound := Pos(AFindText, Memo1.Text) > 0;
end;

procedure TForm1.TMSFNCFindDialog1FindNext(Sender: TObject; AFindText: string; var AFound: Boolean);
begin
  AFound := Pos(AFindText, Copy(Memo1.Text, Memo1.SelStart + Memo1.SelLength + 1, MaxInt)) > 0;
end;

Use the Extended View

Enable fdoMoreEnabled and fdovMore to expose the More button. Add fdoMoreExpanded when the multi-line search field should be visible as soon as the dialog opens.

TMSFNCFindDialog1.Options := TMSFNCFindDialog1.Options + [fdoMoreEnabled, fdoMoreExpanded];
TMSFNCFindDialog1.VisibleOptions := TMSFNCFindDialog1.VisibleOptions + [fdovMore, fdovFindMemo];
TMSFNCFindDialog1.VisibleOptions := TMSFNCFindDialog1.VisibleOptions - [fdovContinueToNextFile];
TMSFNCFindDialog1.OnSetMarker := TMSFNCFindDialog1SetMarker;

Combining search history, find events, and extended view

The following example pre-loads recent searches, handles both find and find-next, and enables the extended multi-line search view by default:

procedure TForm1.FormCreate(Sender: TObject);
begin
  { Pre-populate history from the last session. FindList is a TStringList. }
  TMSFNCFindDialog1.FindList.AddStrings(FRecentSearches);
  TMSFNCFindDialog1.AutoHistory := True;

  { Two separate sets: Options holds behaviour flags (TTMSFNCFindDialogOption)
    and VisibleOptions decides which controls are shown
    (TTMSFNCFindDialogVisibleOption). fdoMore* and fdovMore are NOT
    interchangeable - each belongs to its own set. }
  TMSFNCFindDialog1.Options := TMSFNCFindDialog1.Options
    + [fdoMoreEnabled, fdoMoreExpanded];
  TMSFNCFindDialog1.VisibleOptions := TMSFNCFindDialog1.VisibleOptions
    + [fdovMore];
end;

{ OnFind and OnFindNext share one signature, TTMSFNCFindDialogFindEvent: the
  search flags are not passed as a parameter - read them from Options. }
procedure TForm1.TMSFNCFindDialog1Find(Sender: TObject; AFindText: string;
  var AFound: Boolean);
begin
  AFound := DoSearch(AFindText,
    fdoCaseSensitive in TMSFNCFindDialog1.Options,
    fdoWholeWordOnly in TMSFNCFindDialog1.Options,
    True { start from the top });
end;

procedure TForm1.TMSFNCFindDialog1FindNext(Sender: TObject; AFindText: string;
  var AFound: Boolean);
begin
  { Direction is a flag too: fdoDown is set when the user searches forwards. }
  AFound := DoSearch(AFindText,
    fdoCaseSensitive in TMSFNCFindDialog1.Options,
    fdoWholeWordOnly in TMSFNCFindDialog1.Options,
    False { continue from the current position });
end;

See Also