Посылка сообщений
Так же как система Windows посылает свои сообщения различным окнам, в самом приложении также может появиться необходимость обмена сообщениями между его собственными окнами и элементами управления. Для посылки сообщений существует несколько способов: метод PerForm() (работающий независимо от API Windows), а также функции API Win32 SendMessage() и PostMessage().
Метод PerForm(), которым обладают все потомки класса TControl:
function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
Чтобы послать сообщение форме или элементу управления, применяется следующий синтаксис:
RetVal:= ControlName.PerForm(MessageID, wParam, lParam);
При вызове PerForm() управление вызывающей программе не возвратится, пока сообщение не будет обработано. Этот метод передает сообщение, минуя систему передачи сообщений API Windows.
Функции API SendMessage() и PostMessage(), объявленные в модуле Windows следующим образом:
function SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
function PostMessage(hWnd: HWND; Msg: UINT;
wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
hWnd – дескриптор окна получателя сообщения; Msg – идентификатор сообщения; wParam и lParam – дополнительные данные.
Функция SendMessage() подобно методу PerForm() посылает сообщение непосредственно процедуре окна и ожидает его обработки, а функция PostMessage() помещает сообщение в очередь сообщений и возвращает управление вызвавшей ее программе, не дожидаясь результатов обработки.
Функция SendMessage() возвращает значение, полученное в результате обработки сообщения. Функция PostMessage() – возвращает значение, которое показывает, удалось ли поместить сообщение в очередь сообщений.
Пользовательские сообщения
При разработке приложений может возникнуть ситуация, при которой приложению потребуется послать специальное сообщение либо самому себе, либо другому приложению для выполнения некоторых действий. Для сообщений, придуманных пользователем, в Windows зарезервированы значения от WM_USER до $7FFF.
Пример пользовательского сообщения:
const
TestMsg = WM_USER + 100; // идентификатор сообщения
type
TForm1 = class(TForm)
private
// метод обработки сообщения:
procedure MyMessage(var Msg: TMessage); message TestMsg;
end;
...
procedure TForm1.MyMessage(var Msg: TMessage);
begin
ShowMessage('Работает сообщение TestMsg');
Msg.Result:= 1; // возвращаемый результат
end;
Примеры посылки сообщения форме:
if Form1.PerForm(TestMsg, 0, 0) = 1 then
ShowMessage('Сообщение успешно обработано');
if SendMessage(Form1.Handle, TestMsg, 0, 0) = 1 then
ShowMessage('Сообщение успешно обработано');
if PostMessage(Form1.Handle, TestMsg, 0, 0) then
ShowMessage('Сообщение помещено в очередь сообщений');
События Delphi
Событие – это то, что происходит в процессе работы программы. С точки зрения языка Delphi, событие – это свойство процедурного типа, и его значением является указатель на некоторый метод. Присвоить такому свойству значение означает указать адрес метода, который будет выполняться в момент наступления события. Такие методы называются обработчиками событий.
Использование событий позволяет к существующему классу добавить новую функциональность без создания класса-потомка.
Свойства событий стараются начинать со слова "On", за которым следует имя события.
Взаимосвязь сообщений и событий
Delphi представляет собой интерфейс для взаимодействия с сообщениями Windows, по крайней мере – с некоторой их частью. Многие события компонентов библиотеки VCL непосредственно связаны с сообщениями Windows типа WM_XXX: