Шаг 15.
Вкладка Additional. Компонент TApplicationEvents

    На этом шаге мы рассмотрим компонент TApplicationEvents.

    Компонент TApplicationEvents впервые введен в версии Delphi 5. В отличие от остальных компонентов страницы Additional он не имеет видимого эквивалента в работающей программе. Его основное и единственное назначение - служить приемником многочисленных сообщений, которые Windows посылает работающей программе.

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

    Любая форма может иметь сколько угодно компонентов TAppicationEvents. Одно и то же сообщение поступает последовательно в каждый из них до тех пор, пока это сообщение не будет обработано или пока оно не поступит всем. Порядок получения сообщений обратен порядку размещения компонентов на форме: вначале сообщение получит последний размещенный на форме компонент, затем предпоследний и т. д. Этот порядок можно изменить с помощью метода Activate. Запретить получение остальным компонентам уже обработанного сообщения можно с помощью метода CancelDispatch, если в проекте имеется несколько форм, расположенные на них компоненты TAplicationEvents начинают получать сообщения только после того, как соответствующая форма станет активной. Работа всех компонентов TApplicationEvents будет блокирована, если в объекте Application определен обработчик события onMessage.

    Методы компонента TApplicationEvents:

Таблица 1. Методы компонента TApplicationEvents
Метод Описание
Procedure Activate; Делает компонент первым получателем сообщения.
Procedure CancelDispatch; Запрещает получение текущего сообщения остальным компонентам.

    События компонента TApplicationEvents:

Таблица 2. События компонента TApplicationEvents
Событие Описание
type TActionEvent = procedure(Action: TBasicAction; var Handled: Boolean) of objects;
Property OnActionExecute: TActionEvent;
Это событие возникает тогда, когда пользователь активизирует управляющий элемент, приписанный определенному действию, в котором не определен обработчик OnExecute.
type TActionEvent = procedure(Action: TBasicAction; var Handled: Boolean) of object;
Property OnActionUpdate: TActionEvent;
Это событие возникает когда пользователь активизирует управляющий элемент, приписанный определенному действию, в котором не определен обработчик OnUpdate.
Property OnActivate: TNotifyEvent; Возникает при активизации приложения.
Property OnDeactivate: TNotifyEvent; Возникает при деактивизации приложения.
type TExceptionEvent = procedure(Sender: TObject; E: Exception) of object;
Property OnException: TExceptionEvent;
Возникает перед умалчиваемой обработкой исключения, для которого нет соответствующего программного обработчика.
type THelpEvent = function(Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of object;
Property OnHelp: THelpEvent;
Возникает перед вызовом встроенной справочной службы. Параметру CallHelp следует придать значение True, если программа должна после завершения обработчика вызвать справочную службу.
Property OnHint: TNotifyEvent; Возникает перед выдачей оперативной справки для компонента, свойство Hint которого не пустая строка.
type TIdleEvent = procedure(Sender: TObject; var Done: Boolean) of object;
Property OnIdle: TIdleEvent;
Возникает, когда программа переходит, в состояние ожидания. Если в Done установлено значение False, после выполнения других работ Windows вновь вызывает приостановленную программу, в противно случае вызов программы происходит только при поступлении в ее адрес очередного сообщения.
type TMessageEvent = procedure(var Msg: TMsg; var Handled: Boolean) of object;
Property OnMessage: TMessageEvent;
Возникает при поступлении любого сообщения от Windows. Msg - сообщение, Handled=True, если обработчик завершил обработку сообщения.
Property OnMinimize: TNotifyEvent; Возникает при минимизации главного окна программы.
Property OnRestore: TNotifyEvent; Возникает при восстановлении размеров главного окна программы.
ShortCutEvent = procedure(var Msg: TWMKey; var Handled: Boolean) of object;
Property OnShortCut: TshortCutEvent;
Возникает, когда пользователь нажал клавишу на клавиатуре (перед событиями ОnKeyDown или OnKeyPress). Позволяет программе распознать и интерпретировать нажатие клавиш-акселераторов.
type TShowHintEvent = procedure(var HintStr: String; var CanShow: Boolean; var Hintlnfo: THintInfo) of object;
Property OnShowHint: TShowHintEvent;
Возникает перед появлением оперативной справки Hint.
  • HintStr - строка для справки;
  • Hintlnfo - информация об окне справки.
Установите в CanShow значение True, если нужно отобразить справку (остальные параметры к этому времени могут быть изменены).

    Обычно TApplicationEvents используется для обработки исключительных ситуаций.

    Рассмотрим небольшой пример:

    Создадим приложение, которое в зависимости от того, активно оно или нет (щелчок мыши на окне этого приложения делает его активным, щелчок на другом окне делает его пассивным), будет выводить надпись 'Приложение активно' или 'Приложение не активно'.

    Для реализации данного примера создадим форму и разместим на ней компоненты: TApplicationEvents и TLabel.


Рис.1.Windows-окно примера при проектировании

    Необходимо создать обработчик события OnIdle, следующего вида:

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
  if Application.Active
  then Label1.Caption:='приложение активно'
    else Label1.Caption:='приложение не активно';
end;
Текст этого примера можно взять здесь.


Рис.2.Окно приложения при запуске

    Можно создать обработчик щелчка мыши, перехватывая сообщение от щелчка мыши (рис.3.). Для этого используется событие OnMessage.

    Обработчик события OnMessage имеет следующий вид:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var point:TPoint;
begin
 if Msg.message=WM_LButtonUp
  then
   begin
    point:=ScreenToClient(Msg.pt);
    Label1.Caption:=IntToStr(point.X)+'  '+IntToStr(point.Y);
   end;
end;
Текст этого примера можно взять здесь.


Рис.3.Окно приложения при запуске

    На следующем шаге мы рассмотрим компонент TValueListEditor.




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