426______________________________________________Глава 7

private:

TNotifyEvent FOnClear;

_published:

_property TNotifyEvent OnClear = <read=FOnClear, write=FOnClear};

Эти объявления создают поле FOnClear типа TNotifyEvent, соответствующее
событию. А само событие объявляется точно так же, как любое свойство. Только в
read и write записываются не функции чтения и записи, а само поле.

Остается только вызвать в нужный момент обработчик события пользователя,
если пользователь его предусмотрел. Проверка, имеется ли обработчик пользовате-
ля, осуществляется проверкой соответствующего события как булевой величины,
возвращающей true, если пользователь предусмотрел свой обработчик. В нашем
случае эта проверка и вызов обработчика пользователя осуществляется добавлени-
ем в начало написанной ранее процедуры метода Clear оператора:

if (OnClear) OnClear(this);

который вызывает обработчик пользователя OnClear.

Внесите указанные изменения в файлы компонента, откомпилируйте их, вы-
делите на форме тестового приложения компонент EditLetNumI и посмотрите
страницу событий в Инспекторе Объектов. Вы увидите, что в списке его событий
появилось событие OnClear. Дважды щелкните на его правом окне и вы увидите в
тексте модуля заготовку для обработчика этого события:

void_fastcall TFormI::EditLetNumlClear(TObject *Sender)

(

)

Внесите в этот обработчик какой-нибудь оператор, который бы отображал на
экране факт свершения этого события, например:

ShowMessage("Событие OnClear");

Проверьте ваше тестовое приложение в работе.

Мы рассмотрели простейший вариант задания события типа TNotifyEvent.
Попробуем несколько усложнить это событие. Пусть мы будем передавать в это со-
бытие параметр CanClear, который по умолчанию равен true, что будет означать
разрешение очистить текст окна редактирования. Но предоставим пользователю
возможность в своем обработчике события задать этому параметру значение false,
что будет означать отказ от очистки.

Чтобы решить эту задачу, вам надо объявить новый тип события. Это объявле-
ние делается с помощью ключевого слова _closure. Пусть, например, вы хотите
дать вводимому новому типу событий имя TClear. Тогда объявление указателя на
этот тип может иметь вид:

typedef void   fastcall ( closure *TClear)(System::TObject *Sender,
bools CanClear) ;

Приведенный код объявляет указатель на функцию, принимающую два пара-
метра: традиционный для всех обработчиков параметр Sender и булев параметр
CanClear, который пользователь сможет изменять.

Приведенное выше объявление типа должно помещаться перед описанием
класса. Тогда в объявлениях свойства и его поля надо ссылаться на этот тип, сле-
дующим образом изменив соответствующие операторы:

TClear FOnClear;

property TClear OnClear = (read=FOnClear, write=FOnClear);