Введение в DELPHI

       

Обработка сообщений Windows в Delphi


Конечно, нельзя придумать такую библиотеку объектов, которые бы полностью соответствовали потребностям программистов. Всегда возникнет необходимость дополнения или изменения свойств и поведения объектов. В этом случае, так же, как и при создании своих собственных компонент в Delphi, часто требуется обрабатывать сообщения Windows. Поскольку Object Pascal является развитием и продолжением Borland Pascal 7.0, то это выполняется сходным с BP способом.

Общий синтаксис для декларации обработчика сообщений Windows: procedure Handler_Name(var Msg : MessageType); message WM_XXXXX;

Handler_Name обозначает имя метода; Msg - имя передаваемого параметра; MessageType - какой либо тип записи, подходящий для данного сообщения; директива message указывает, что данный метод является обработчиком сообщения; WM_XXXXX - константа или выражение, которое определяет номер обрабатываемого сообщения Windows.

Рассмотрим обработку сообщений на примере. Например, при нажатии правой кнопки мыши на форме в программе появляется всплывающее меню (pop-up menu, если оно было привязано к этой форме). Программист может захотеть привязать к правой кнопке какое-нибудь другое событие. Это можно сделать так: type TForm1 = class(TForm) PopupMenu1: TPopupMenu; MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; private { Private declarations } procedure WMRButtonDown(var Msg : TWMMouse); message WM_RBUTTONDOWN; public { Public declarations } end;

Подчеркнут код, добавленный в декларацию объекта TForm1 вручную. Далее, в секции implementation нужно написать обработчик: procedure TForm1.WMRButtonDown(var Msg : TWMMouse); begin MessageDlg('Right mouse button click.', mtInformation, [mbOK], 0); end;

В данном случае при нажатии правой кнопки мыши будет появляться диалог.

Вообще-то, у класса TForm уже есть унаследованный от дальнего предка обработчик данного события, который называется точно также и вызывает то самое pop-up меню. Если в новом обработчике сообщения нужно выполнить действия, которые производились в старом, то для этого применяется ключевое слово inherited. Если слегка модифицировать наш обработчик, то после диалога будет появляться pop-up меню: procedure TForm1.WMRButtonDown(var Msg : TWMMouse); begin MessageDlg('Right mouse button click.', mtInformation, [mbOK], 0); inherited; end;

Однако, есть еще способ обработки всех сообщений, которые получает приложение. Для этого используется свойство OnMessage объекта Application, который автоматически создается при запуске программы. Если определен обработчик события OnMessage, то он получает управление при любом событии, сообщение о котором направлено в программу. Следующий код будет приводить к появлению диалога при двойном щелчке мыши на любом объекте в приложении. procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage:=AOM; end; procedure TForm1.AOM(var Msg: TMsg; var Handled: Boolean); begin Handled:=False; if Msg.Message = WM_LBUTTONDBLCLK then begin MessageDlg('Double click.', mtInformation, [mbOK], 0); Handled:=True; end; end;

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



Содержание раздела