На этом шаге мы рассмотрим компонент, используемый для поиска фрагмента текста.
Стандартное диалоговое окно компонента TFindDialog используется для поиска фрагмента текста (рисунок 1).
Рис.1. Стандартное окно компонента TFindDialog
Свойства компонента TFindDialog перечислены в таблице 1.
Свойство | Описание |
---|---|
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.