Определение событий

Формально C++Builder определяет событие как типизированный указатель на метод в специфическом экземпляре класса:

<тип>(_closure * <имя метода>) (<список параметров>)

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

Когда пользователь выполняет присваивание некоторому событию, происходит присваивание не просто метода с конкретным именем, а метода в специфическом экземпляре класса. В качестве экземпляра класса, указатель которогоthisпередается как скрытый параметр, обычно (но не всегда) выступает форма, которая содержит данную компоненту.

все символы к верхнему регистру. Для этого надо определить следующий обработчик события нажатия клавиши:

void _fastcall TFormI::EditlKeyPress

(TObject *Sender,char SKey) {

Key = UpCase(Key) ;

)

Передача адресных аргументов может также использоваться для переопределения поведения обработчика события по умолчанию.

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

При разработке компонент нужно учитывать следующие аспекты обработчиков событий:

• Прикладные программисты не обязаны обрабатывать события. Различные события возникают практически постоянно при работе любого приложения Windows. Простое смещение курсора по компоненте вызывает передачу многочисленных сообщений Windows данной компоненте о передвижении мыши, которые компонента транслирует в события OnMouseMove. Если поведение компоненты не зависит от манипуляций мышью, то в большинстве случаев программа просто не обращает внимание на такие события.

• Прикладные программисты могут написать любой код обработки события.Компоненты VCL реализуют свои события так, чтобы свести к минимуму риск неверной реакции вследствие логических ошибок в обработчике события. Конечно, невозможно защититься от всех ошибок, однако можно, например, перед вызовом обработчика выполнить инициализацию всех структур данных, чтобы пользователи не получали неопределенной информации.