Шаг 8.
Вкладка Dialogs. Компонент TFindDialog

    На этом шаге мы рассмотрим компонент, используемый для поиска фрагмента текста.

    Стандартное диалоговое окно компонента TFindDialog используется для поиска фрагмента текста (рисунок 1).


Рис.1. Стандартное окно компонента TFindDialog

    Свойства компонента TFindDialog перечислены в таблице 1.

Таблица 1. Свойства компонента TFindDialog
Свойство Описание
property FindText: String; Определяет образец поиска
property Left: Integer; Содержит горизонтальную позицию левого верхнего угла места появления окна
property Options: TFindOptions; Определяет настройку диалогового окна (см. ниже)
property Position: TPoint; Содержит горизонтальную и вертикальную позиции левого верхнего угла места появления окна
property Top: Integer; Содержит вертикальную позицию левого верхнего угла места появления окна

    Для компонента определен следующий тип, использующийся в свойстве Options:

type TFindOption = (frDown, frFindNext, frHideMatchCase,
        frHideWholeWord, frHideUpDown, frMatchCase, 
        frDisableMatchCase, frDisableUpDown, frDisableWholeWord, 
        frReplace, frReplaceAll, frWholeWord, frShowHelp);
TFindOptions = set of TFindOption;
Его значения имеют следующий смысл:

    Специфичной для диалогового окна является реализуемая им возможность просмотра найденного фрагмента и при необходимости продолжение поиска. С этой целью для компонента определено событие OnFind: TNotifyEvent, которое возникает всякий раз, когда пользователь щелкает на кнопке Найти далее. Обработчик события должен найти образец в тексте и показать его пользователю.

    Приведем простой пример использования этого компонента.

    На форме разместим компонент TFindDialog, а также кнопку TButton и компонент TMemo, содержащий текст, в котором будет осуществляться поиск.


Рис.2. Внешнинй вид проекта

    Кнопка TButton используется для активизации окна поиска:

{$R *.dfm}
var
  p: Integer; // Позиция, с которой начнется очередной поиск

procedure TForm1.Button1Click(Sender: TObject);
begin
  p:=1; // Первоначальное значение позиции: поиск сначала текста
  FindDialog1.Execute;
end;

    Кроме того, здесь определяется глобальная переменная, которая будет содержать значение позиции текста, с которого осуществляется поиск очередного фрагмента.

    В целом реализация алгоритма поиска выглядит так: по щелчку на кнопке Найти далее осуществляем поиск необходимого фрагмента в тексте с позиции, определяемой значением переменной p. Если фрагмент найден, то выделяем его, изменяя значение переменной p так, чтобы последующий поиск осуществлялся со следующего, идущего за найденным, символа. Если искомый фрагмент не найден, то выдаем соответствующее сообщение:

procedure TForm1.FindDialog1Find(Sender: TObject);
var
  SelPos: Integer;
begin
  // Ищем очередной фрагмент в тексте
  SelPos := Pos(FindDialog1.FindText,
                Copy(Memo1.Lines.Text,p,Length(Memo1.Lines.Text)-p+1));
  if SelPos > 0 then
  begin
    // Фрагмент найден - выделяем его
    Memo1.SelStart := SelPos + p - 2;
    Memo1.SelLength := Length(FindDialog1.FindText);
    // Обязательно передаем фокус, чтобы увидеть изменения!!!
    Memo1.SetFocus;
    p:=p + SelPos; //Вычисляем позицию для нового поиска
  end
    else
      ShowMessage('Текст "' + FindDialog1.FindText + '" не найден!');
end;
Текст этого примера можно взять здесь.

    Внешний вид работающего приложения приведен на рисунке 3.


Рис.3. Поиск требуемого фрагмента

    На следующем шаге мы рассмотрим компонент TReplaceDialog.




Предыдущий шаг Содержание Следующий шаг