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



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

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