6.5.7 Методы обработки сообщений

На верх  Назад  Вперёд

Новое в методах обработки message (сообщений) класса. Указатели на методы обработки сообщений хранятся в специальной таблице, вместе с объявленными целыми или строковыми константами.Они в предназначены для облегчения программирования функций обратного вызова в некоторых GUI, таких как Win32 или GTK. В отличии с Delphi, Free Pascal также может использовать строки в качестве идентификаторов сообщений. Методы обработки сообщений всегда виртуальные.

При объявлении класса, методы обработки сообщений объявляются с ключевым словом Message с целочисленной константой (или выражением).

Кроме того, они могут принимать только один var аргумент (типизированный или нет):

Procedure TMyObject.MyHandler(Var Msg); Message 1;

Реализация метода обработки сообщений ничем не отличается от реализации обычного метода. Кроме того, можно вызвать метод обработки сообщения непосредственно, но этого не нужно делать. Вместо этого следует использовать метод TObject.Dispatch. Методы сообщений виртуальны, то есть они могут быть переопределены в классах потомках.

Метод TObject.Dispatch может быть использован для обработки сообщения (message). Сообщение (аргумент метода) объявлено в модуле system, первым должно быть поле типа Cardinal с идентификатором сообщения.

Например:

Type

TMsg = Record

  MSGID : Cardinal;

  Data : Pointer;

Var

Msg : TMSg;

 

MyObject.Dispatch (Msg);

В этом примере, метод Dispatch просматривает объект и всех его предков (поиск начинается с объекта и продолжается вверх по дереву наследования класса), чтобы найти метод обработки сообщения с объявленым MSGID . Если такой метод найден, он вызывается с параметром Msg.

Если такой метод не найден, вызывается DefaultHandler. DefaultHandler представляет собой виртуальный метод TObject, который по умолчанию ничего не делает, но он может быть перекрыт, чтобы обеспечить ту обработку, которая может понадобиться. DefaultHandler объявлен ​​следующим образом..:

procedure DefaultHandler(var message);virtual;

Кроме сообщения с идентификатором Integer, Free Pascal также поддерживает метод сообщения со строковым идентификатором.

Procedure TMyObject.MyStrHandler(Var Msg); Message 'OnClick';

В отличае от метода, где идентификатор - целое число, в этом случае идентификатором является строка.

Метод TObject.DispatchStr может быть использован для вызова обработчика сообщений. Этот метод похож на предыдущий (Dispatch),  но в Msg первое поле - строковое. Сообщение (аргумент метода) объявлено в модуле system, первым должно быть поле типа String с идентификатором сообщения. Например:

Type

TMsg = Record

  MsgStr : String[10]; // Произвольное, длиной до 255 символов.

  Data : Pointer;

Var

Msg : TMSg;

 

MyObject.DispatchStr (Msg);

В этом примере, метод DispatchStr просматривает объект и всех его предков (поиск начинается с объекта и продолжается вверх по дереву наследования класса), чтобы найти метод обработки сообщения с объявленым MsgStr. Если такой метод найден, он вызывается с параметром Msg.

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

procedure DefaultHandlerStr(var message);virtual;

В дополнение к этому механизму (кроме этого механизма), метод обработчика сообщения (строковым идентификатором) принимает параметр self:

Procedure StrMsgHandler(Data: Pointer; Self: TMyObject); Message 'OnClick';

Если компилятор сталкивается таким методом, генерирует код, который загружает в параметр Self указатель на экземпляра объекта. Результатом этого является то, что можно передать Self в качестве параметра для метода.

Примечание:

Параметр Self должен иметь тип класса с определённым методом (обработчика сообщения).