На этом шаге мы рассмотрим компонет, используемый для замены текста.
Компонент TReplaceDialog создает и обслуживает окно поиска и замены текстового фрагмента (рисунок 1).
Рис.1. Стандартное окно компонента TReplaceDialog
Класс TReplaceDialog является прямым потомком класса TFindDialog и наследует от него большую часть свойств. Дополнительно в компоненте определено свойство ReplaceText: String, в котором содержится текст замены, и событие OnReplace, которое возникает при щелчке на кнопке Заменить или Заменить все.
Приведем простой пример использования этого компонента.
На форме разместим компонент TReplaceDialog, а также кнопку TButton и компонент TMemo, содержащий текст, в котором будет осуществляться поиск с последующей заменой.
Рис.2. Внешнинй вид проекта
Кнопка TButton используется для активизации окна поиска и замены:
procedure TForm1.Button1Click(Sender: TObject); begin p:=1; // Первоначальное значение позиции: поиск сначала текста ReplaceDialog1.Execute; end;
Кроме того, здесь определяется глобальная переменная, которая будет содержать значение позиции текста, с которого осуществляется поиск очередного заменяемого фрагмента. Реализация обработчика события OnFind ничем не отличается от аналогичной реализации обработчика для компонента TFindDialog:
procedure TForm1.ReplaceDialog1Find(Sender: TObject); var SelPos: Integer; begin // Ищем очередной фрагмент в тексте SelPos := Pos(ReplaceDialog1.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(ReplaceDialog1.FindText); // Обязательно передаем фокус, чтобы увидеть изменения!!! Memo1.SetFocus; p:=p + SelPos; //Вычисляем позицию для нового поиска end else ShowMessage('Текст "' + ReplaceDialog1.FindText + '" не найден!'); end;
В реализации обработчика события OnReplace нужно учесть тот момент, что он возникает, когда нужно сделать замену во всем тексте или только очередного найденного фрагмента. Определение того, что нужно выполнить в данный момент, выполним по наличию или отсутствию значения frReplaceAll в свойстве ReplaceDialog1.Options:
procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin // Проверяем, нажата ли кнопка "Заменить все" if frReplaceAll in ReplaceDialog1.Options then begin // Нажата - производим замену во всем тексте SelPos := Pos(ReplaceDialog1.FindText,Memo1.Lines.Text); while SelPos>0 do begin Memo1.Lines.Text:= // Берем текст до начала искомого фрагмента, Copy(Memo1.Lines.Text,1,SelPos-1)+ // прибавляем заменяющий текст и ReplaceDialog1.ReplaceText + // добавляем текст после искомого фрагмента. Copy(Memo1.Lines.Text, SelPos + Length(ReplaceDialog1.FindText), Length(Memo1.Lines.Text)-SelPos + Length(ReplaceDialog1.FindText)); SelPos := Pos(ReplaceDialog1.FindText,Memo1.Lines.Text); end end else // Нажата кнопка "Заменить" if Memo1.SelText <> '' then // Если есть выделенный фрагмент - меняем его Memo1.SelText := ReplaceDialog1.ReplaceText; end;
Внешний вид работающего приложения приведен на рисунке 3.
Рис.3. Замена требуемого фрагмента
На следующем шаге мы рассмотрим компонент TPageSetupDialog.