Программирование - это просто
Advertisement
Главная arrow Уроки Delphi arrow Delphi - это просто! arrow Delphi. Урок 4.5. Продолжим изучать поиск и замену. Функция Delphi StringReplace
25.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Delphi. Урок 4.5. Продолжим изучать поиск и замену. Функция Delphi StringReplace Печать E-mail
Автор megabax   
27.06.2009 г.
<strong>Продолжим изучать поиск и замену. Функция Delphi StringReplace</strong>

Продолжим изучать поиск и замену. Функция Delphi StringReplace

 

В предыдущей статье я обещал научить Вас поиску с возможностью поиска без учета регистра. В текстовом редакторе, который мы написали на предыдущих уроках, если вы для поиска ввели слово «хлеб», то у вас найдет слово «хлеб» именно в таком написании, с маленькой буквы. А вот если это слово стоит в начале предложения и написано с заглавной буквы, то программа его «не увидит».

В Delphi есть замечательная функция UpperCase. Она переводит все строчные буквы в заданном тесте в заглавные. Правда, она работает только для латинских букв. Если в тексте есть и русские буквы, тогда нужно использовать AnsiUpperCase.

Для того, что бы не нагружать программу ветками ifthen, вложенными одна в другую, так как это затрудняет чтение и понимание текста программы, введем еще одну локальную переменную SerchStr. Затем перепишем обработчик rdReplaceDialogFind, вот как он теперь будет у нас выглядеть:

 

procedure TfrmMain.rdReplaceDialogFind(Sender: TObject);

var

  I, J, PosReturn, SkipChars: Integer; S,SerchStr:string;

begin

  for I := FI to moText.Lines.Count do

  begin

    if FPosReturn=0 then s:=moText.Lines[I] else s:=copy(moText.Lines[I],FPosReturn+1,Length(moText.Lines[I])-FPosReturn+1);

    if not(frMatchCase in rdReplaceDialog.Options) then

    begin

       s:=AnsiUpperCase(s);

       SerchStr:=AnsiUpperCase(rdReplaceDialog.FindText);

    end else  SerchStr:=rdReplaceDialog.FindText;

 

    if frWholeWord in rdReplaceDialog.Options then

        PosReturn := Pos(' '+SerchStr+' ',s)

    else

        PosReturn := Pos(SerchStr,s);

    if PosReturn <> 0 then {found!}

    begin

      SkipChars := 0;

      for J := 0 to I - 1 do

        SkipChars := SkipChars + Length(moText.Lines[J]);

 

      SkipChars := SkipChars + (I*2);

      SkipChars := SkipChars + PosReturn - 1 + FPosReturn;

      FPosReturn:=FPosReturn+PosReturn;

 

      moText.SetFocus;

      if frWholeWord in rdReplaceDialog.Options then

        moText.SelStart := SkipChars+1

      else

        moText.SelStart := SkipChars;

      moText.SelLength := Length(rdReplaceDialog.FindText);

      FI:=I;

      Break;

    end else FPosReturn:=0;

  end;

 

end;

 

 Запускаем программу и убеждаемся, что у нас действительно поиск работает в двух режимам  с учетом регистра и без учета регистра. Но у нас еще в диалоге поиска и замены остались две нереализованных кнопки: «Заменить» и «Заменить все». Давайте реализуем в нашем редакторе такую возможность. Создадим обработчик события OnReplace диалога поиска и замены:

 

 

procedure TfrmMain.rdReplaceDialogReplace(Sender: TObject);

var

  SelPos: Integer;

begin

    SelPos := Pos(rdReplaceDialog.FindText, moText.Lines.Text);

    if SelPos > 0 then

    begin

      moText.SelStart := SelPos - 1;

      moText.SelLength := Length(rdReplaceDialog.FindText);

      moText.SelText := rdReplaceDialog.ReplaceText;

    end

    else MessageDlg('Текст '+rdReplaceDialog.FindText+' не найден', mtError, [mbOk], 0);

end;

 

 Обратите внимание на moText.Lines.Text. Благодаря свойству Text мы можем напрямую обратится ко всему тексту компонента Memo, не перебирая в цикле все его строки.

Еще посмотрите на строку

 

MessageDlg('Текст " '+rdReplaceDialog.FindText+' " не найден', mtError, [mbOk], 0);

 

 

Заметили, что вместо mtInformation стоит mtError? Этот параметр определяет вид сообщения. Теперь, в случае, когда искомой фразу нет в тексте, сообщение выглядеть так:

 

Собщение Error (Delphi 7, функции, компоненты)

 

 

Но у нас по прежнему не работает кнопка «Заменить все». Для реализации этой функции опять же обратимся к свойству Options компонента ReplaceDialog.  Вот так теперь у нас будет выглядеть обработчик события OnReplace

 

procedure TfrmMain.rdReplaceDialogReplace(Sender: TObject);

var

  SelPos: Integer;

begin

    if not(frReplaceAll in rdReplaceDialog.Options) then

    begin

      SelPos := Pos(rdReplaceDialog.FindText, moText.Lines.Text);

      if SelPos > 0 then

      begin

        moText.SelStart := SelPos - 1;

        moText.SelLength := Length(rdReplaceDialog.FindText);

        moText.SelText := rdReplaceDialog.ReplaceText;

      end

      else MessageDlg('Текст "'+rdReplaceDialog.FindText+'" не найден', mtError, [mbOk], 0);

   end else

      moText.Lines.Text:=StringReplace(moText.Lines.Text,rdReplaceDialog.FindText,rdReplaceDialog.ReplaceText,[rfReplaceAll]);

end;

 

 

И так, мы познакомились с новой опцией диалога поиска и замены frReplaceAll. Если у нас эта опция не присутствует во множестве опций диалога, используем старый алгоритм замены. Если присутствует – то производим замену при помощи функции StringReplace. У нее четыре параметра. Первый – это текс, где нужно произвести замену. Второй – что заменить. Третий – на какой текст заменить искомую строку. Четвертый – опции заменты. Это уже знакомый вам тип – множество.

Опций замены всего две: rfReplaceAll -  заменить все и rfIgnoreCase – не учитывать регистр.

На этом я заканчиваю восьмой урок, а вам небольшое домашнее задание – подумайте, как сделать, что в нашей программе можно было заменять слово целиком, а так же производить замену как с учетом, так и без учета регистра.

 

Последнее обновление ( 30.06.2012 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги