218______________________________________________Глава 3

RichEditl->SelStart = FoundAt;

RichEditl->SelLength = Fi,ndDialogl->FindText. Length ();

)

else ShowMessage("Текст '" + Fin.dDialogl->FindText + "' не найден");'
}

Функция MFindClick задает в качестве начального значения для поиска
текст, выделенный в RichEditI, и затем вызывает диалог поиска FindDialogl.
Функция FindDialoglFind является обработчиком события OnFind компонента
FindDialogl. Она срабатывает, когда пользователь нажал в диалоге кнопку Найти
далее. Комментарии в тексте этой функции поясняют этапы поиска. Сначала про-
изводится установка области текста (переменные StartPos и ToEnd), в которой
проводится поиск. Затем устанавливаются атрибуты поиска — формируется мно-
жество Option в зависимости от установленных пользователем опций. Затем мето-
дом FindText проводится сам поиск. Если нового вхождения искомого текста не
найдено (метод FindText вернул -1), то пользователю выдается сообщение об этом с
помощью функции ShowMessage.

Приведенный пример относился к поиску в компоненте RichEdit. Для органи-
зации поиска в тексте компонента Memo удобно использовать метод Pos класса
AnsiString, который объявлен следующим образом:

int _fastcall Pos(const AnsiStrings subStr) const;

Метод возвращает индекс первого символа первого вхождения подстроки subStr
в строку, к которой применяется этот метод. Индексы начинаются с 1. Если subStr не
содержится в строке, то возвращается 0.

Для организации поиска потребуются еще две функции класса AnsiString:

Substring и LowerCase. Первая из них определена как:

AnsiString   fastcall Substring(int index, int count) const;

Она возвращает подстроку, начинающуюся с символа в позиции index и содер-
жащую count символов.

Функция LowerCase, определенная как

AnsiString   fastcall LowerCaseО const;

возвращает строку символов S, переведенную в нижний регистр.

Теперь мы можем рассмотреть пример организации поиска. Пусть в вашем при-
ложении имеется компонент Memol и при выборе раздела меню MFind вы хотите ор-
ганизовать поиск в тексте, содержащемся в Memol. Для упрощения задачи исклю-
чим опцию поиска только целых слов и опцию поиска вверх от положения курсора.

Программа, реализующая поиск, может иметь следующий вид:

void _fastcall TFormI::MFindClick(TObject *Sender)

{

/* начальное значение текста поиска — текст, выделенный в Memol */

FindDialogl->FindText = Memol->SelText;

FindDialogl->Execute() ;

t
//—————————————————————————

.   void _fastcall TFormI::FindDialoglFind(TObject *Sender)
^   (

int FoundAt, StartPos, ToEnd;

/* если было выделение, то поиск идет начиная с его

последнего символа, иначе — с позиции курсора */

StartPos = Memol->SelStart;                                         i
if (Memol->SeiLength)                                               !
StartPos += Memol->SetLength;

I