Вкладка 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;

Его значения имеют следующий смысл:

  • frDown - устанавливает поиск вперед по тексту;
  • frFindNext - сообщает программе, что пользователь щелкнул на кнопке Найти далее;
  • frHideMatchCase - снимает флажок С учетом регистра;
  • frHideWholeWord - снимает флажок Только слово целиком;
  • frHideUpDown - скрывает переключатели выбора направления поиска;
  • frMatchCase - устанавливает флажок С учетом регистра;
  • frDisableMatchCase - делает недоступным флажок С учетом регистра;
  • frDisableUpDown - запрещает выбор направления поиска;
  • frDisableWholeWord - делает недоступным флажок Только слово целиком;
  • frReplace - используется в компоненте TReplaceDialog и указывает на необходимость замены найденного фрагмента;
  • frReplaceAll - используется в компоненте TReplaceDialog и указывает на необходимость замены всех вхождений образца поиска;
  • frWholeWord - устанавливает флажок Только слово целиком;
  • frShowHelp - включает в окно кнопку Справка.

   
Специфичной для диалогового окна является реализуемая им возможность просмотра найденного фрагмента и при необходимости
продолжение поиска. С этой целью для компонента определено событие 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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий