Шаг 19.
Компонент ApplicationEvents

    На этом шаге мы рассмотрим другой способ обработки событий класса TApplication.

    В классе TApplication определено множество событий, которые бывают полезными для организации приложения. Начиная с Delphi 5, разработчиками был введен компонент ApplicationEvents (вкладка Additional), который облегчил использование событий этого класса. Этот компонент перехватывает события объекта Application, поэтому обработчики этих событий теперь можно писать как обработчики событий невизуального компонента ApplicationEvents. На каждой форме приложения можно разместить свой компонент ApplicationEvents. События объекта Application будут передаваться всем этим компонентам. Если требуется передавать событие, прежде всего, какому-то одному из них, то нужно применить к нему метод Activate, который поставит его в начало очереди компонентов ApplicationEvents. Если не требуется, чтобы другие компоненты ApplicationEvents получали события, нужно применить к этому привилегированному компоненту метод CancelDispatch. Тогда после обработки события в данном компоненте другие компоненты ApplicationEvents вообще не будут реагировать на эти события.

    Во многие обработчики событий компонента ApplicationEvents передается по ссылке параметр Handled. По умолчанию его значение равно False. Если событие уже обработано и не требуется его дальнейшая обработка другими компонентами ApplicationEvents, то в обработчике нужно установить Handled в True. В противном случае это событие будут пытаться обработать другие компоненты ApplicationEvents (если они есть). Если событие так и останется необработанным, то его будет пытаться обработать активный компонент, а если не обработает - то активная форма. Предотвратить обработку события другими компонентами можно, используя метод CancelDispatch.

    Ниже приведена таблица событий компонента ApplicationEvents с их краткими описаниями.

   
Таблица 1. События компонента ApplicationsEvents
Событие Описание
property OnActionExecute: TActionEvent; Возникает при выполнении (Execute) некоторого действия, объявленного в компоненте, но не обработанного им (не написан соответствующий обработчик). Инициализация этого события может быть, например, выполнена методом Application.ExecuteAction(<имя действия>). Если событие не обработано в соответствующем компоненте, то оно может быть обработано на уровне приложения. В этот обработчик передается параметр Action (действие) и по ссылке передается параметр Handled.
property OnActionUpdate: TActionEvent; Возникает при обновлении (Update) некоторого действия, объявленного в компоненте, но не обработанного им (не написан соответствующий обработчик). Если событие не обработано в соответствующем компоненте, то оно может быть обработано на уровне приложения. В этот обработчик передается параметр Action (действие) и по ссылке передается параметр Handled.
property OnActivate: TNotifyEvent; Возникает, когда приложение является активным. Это происходит при начале выполнения и в случаях, когда пользователь, перейдя к другим приложениям, вернулся в данное. Если это событие обработано в ApplicationEvents, то предотвратить его дальнейшую обработку можно методом CancelDispatch.
property OnDeactivate: TNotifyEvent; Возникает перед тем моментом, когда приложение перестает быть активным (пользователь переключается на другое приложение). Если это событие обработано в ApplicationEvents, то предотвратить его дальнейшую обработку можно методом CancelDispatch.
property OnException: TExceptionEvent;
type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
Возникает, когда в приложении сгенерировано исключение, которое нигде не обработано. В обработчик передается параметр Sender - источник исключения, и параметр E типа Exception - объект исключения. Параметр E помогает определить тип исключения. Например: if (E is EDivByZero) then .... В этом обработчике можно предусмотреть нестандартную обработку исключений на уровне приложения, например, русифицировать стандартные сообщения об исключениях и дать какие-то рекомендации. Введение обработчика OnExeption отключит стандартную реакцию приложения на исключительные ситуации.
property OnHint: TNotifyEvent; Возникает тогда, когда курсор мыши начинает перемещаться над компонентом, в котором определено свойство Hint. При этом значение свойства Hint компонента переносится в свойство Hint приложения (Application.Hint) и в обработчике данного события эта подсказка может отображаться, например, в строке состояния.
property OnIdle: TIdleEvent;
type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
Возникает, когда приложение начинает простаивать, ожидая, например, действий пользователя. В обработчик передается по ссылке параметр Done, который по умолчанию равен True. Если оставить его без изменения, то по окончании работы обработчика данного события будет вызвана функция WaitMessage API Windows, которая займется в период ожидания другими приложениями. Если придать этому параметру значение False, то эта функция вызываться не будет. Это может снизить производительность Windows.
property OnMessage: TMessageEvent;
type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;
Возникает, когда приложение получает сообщение Windows (но не переданное функцией SendMessage API Windows). В обработчике этого события можно предусмотреть нестандартную обработку сообщения. Сюда передается параметр Msg - полученное сообщение и по ссылке передается параметр Handled. В Windows передаются тысячи сообщений в секунду, так что обработчик этого события может серьезно снизить производительность приложения.
property OnMinimize: TNotifyEvent; Возникает при сворачивании приложения.
property OnRestore: TNotifyEvent; Возникает при восстановлении ранее свернутого приложения.
property OnShortCut: TShortCutEvent; Возникает при нажатии пользователем клавиши. Событие возникает до того, как возникло стандартное событие OnKeyDown компонента или формы. Обработчик позволяет предусмотреть нестандартную реакцию на нажатие какой-то клавиши. В него передается параметр сообщения Windows Msg, поле CharCode которого (Msg.CharCode) содержит виртуальный код нажатой клавиши. Передается также по ссылке параметр Handled. Если задать ему значение True, то стандартные события OnKeyDown, OnKeyPress, OnKeyUp не наступят.
property OnShowHint: TShowHintEvent;
type TShowHintEvent = procedure (var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo) of object;
Возникает, когда приложение собирается отобразить ярлычок с текстом подсказки Hint. В обработчик передается по ссылке параметр HintStr - первая часть свойства Hint компонента, ярлычок которого должен отображаться. В обработчике этот текст можно изменить. Также по ссылке передается параметр CanShow. Если в обработчике установить его значение равным False, то ярлычок отображаться не будет. Следующий параметр, передаваемый по ссылке - HintInfo. Это структура, поля которой содержат информацию о ярлычке: его координаты, цвет и т.п. В частности, имеется поле HintControl - компонент, сообщение которого должно отображаться в ярлычке, и поле HintStr - отображаемое сообщение. По умолчанию HintInfo.HintStr - первая часть свойства Hint компонента. Но в обработчике это значение можно изменить.

    Приведем примеры использования событий компонента ApplicationsEvents.


    Пример 1. Расположим на форме компоненты TApplicationsEvents (вкладка Additional), TStatusBar (вкладка Win32) и два компонента TEdit (вкладка Standart). В свойства Hint компонентов TEdit поместите соответственно следующий текст: "Подсказка 1", "Подсказка 2". В свойства Text этих компонентов поместите "длинный" текст, например: "Это пример длинного текста", "Еще один пример длинного текста". Свойство SimplePanel компонента TStatusBar установите в True.


Рис.1. Внешний вид приложения

    Обработчик события OnHint компонента TApplicationsEvents:

   procedure TForm1. ApplicationEvents1Hint(Sender: TObject);
   begin
     StatusBar1.SimpleText:= Application.Hint; 
   end;

отображает в строке состояния StatusBar1 значение свойства Hint любого компонента, в котором определено этой свойство и над которым перемещается курсор мыши. Отображение происходит независимо от значения свойства ShowHint компонента.

    Для дальнейшей работы установите у компонентов TEdit свойство ShowHint в True. Обработчик события OnShowHint:

   procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String; 
				 var CanShow: Boolean; var HintInfo: THintInfo);
   begin
	if (HintInfo.HintControl.ClassName='TEdit') then
	begin
                //Размещение в подсказке текста из компонента.
		HintStr:=(HintInfo.HintControl as TEdit).Text;
                //Отмена дальнейшей обработки.  
		ApplicationEvents1.CancelDispatch;
	end;
   end;

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

    Текст этого примера можно взять здесь.


    Пример 2. Расположите на форме компоненты TLabel (вкладка Standart) и TApplicationsEvents (вкладка Additional). Для последнего компонента создайте обработчики событий OnActivate и OnDeactivate:
   procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
   begin
	Label1.Caption:='Ура! Я работаю!';
   end;

   procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
   begin
	Label1.Caption:='Увы! Меня покинули!';
   end;

    Эти обработчики обеспечивают появление в метке Label1 соответствующей надписи каждый раз, когда пользователь переключается из данного приложения в другое и возвращается назад.

    Текст этого примера можно взять здесь.

    На следующем шаге мы рассмотрим состав класса TScreen.




Предыдущий шаг Содержание Следующий шаг