Обзор компонентов библиотеки C++Builder_______________________217

замену надо осуществлять программно. Для этого можно пользоваться событием
OnFind, происходящим, когда пользователь нажал в диалоге кнопку Найти далее,
и событием OnReplace, возникающим, если пользователь нажал кнопку Заменить
или Заменить все. В событии OnReplace можно узнать, какую именно кнопку на-
жал пользователь, по значениям флагов frReplace и frReplaceAll.

Поиск заданного фрагмента в компоненте RichEdit легко проводить, исполь-
зуя его метод FindText, объявленный следующим образом:

enum TSearchType { stWholeWord, stMatchCase };

typedef Set<TSearchType,stWholeWord,stMatchCase> TSearchTypes;

int   fastcall FindText(const System::AnsiString SearchStr,

int StartPos, int Length, TSearchTypes Options);

Этот метод ищет в тексте RichEdit фрагмент, заданный параметром Se-
archStr. Поиск идет начиная с позиции StartPos (позиция первого символа текста
считается нулевой) на протяжении Length символов. Параметр является множест-
вом, которое может содержать элементы stWholeWord (поиск только целого сло-
ва) и stMatchCase (поиск с учетом регистра). Метод возвращает позицию найден-
ного вхождения. Если заданный фрагмент не найден, возвращается -1.

Ниже приведен код, осуществляющий поиск заданного фрагмента в тексте
компонента RichEdit 1.

void_fastcall TFormI::MFindClick(TObject *Sender)

{

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

FindDialogl->FindText = RichEditl->SelText;

FindDialogl->Execute();

)
//—————————————————————————

void_fastcall TFormI::FindDialoglFind(TObject *Sender)
{

int FoundAt, StartPos, ToEnd;

TSearchTypes Option;

/* если было выделение, то поиск идет начиная с его
последнего символа, иначе — с позиции курсора */
StartPos = RichEditl->SelStart;

if (RichEditl->SelLength)

StartPos += RichEditl->SelLength;

/* ToEnd — длина текста, начиная с первой позиции поиска и до конца */
ToEnd = RichEditl->Text.Length() - StartPos;

/* поиск целого слова или нет в зависимости от установки пользователя */
if (FindDialogl->Options.Contains(frWholeWord))
Option <:< stWholeWord;

else Option » stWholeWord;

/* поиск с учетом или'без учета регистра в зависимости от

установки пользователя */

i? CFindDialogI->Options.Contains(frMatchCase))
Option « stMatchCase;

else Option » stMatchCase;

FoundAt = RichEditl->FindText(FindDialogl->FindText, StartPos,
ToEnd, Option);

if (FoundAt != -1) // если найдено
(

RichEditl->SetFocus();