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

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

    Компонент 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.




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