Главная » Delphi » Использование собственных типов сообщений

0

Аналогично тому, как система  Windows  посылает свои  сообщения различным окнам приложения, в самом приложении также  может  появиться необходимость обмена  сооб щениями между его собственными окнами  и элементами управления. Delphi предоставля ет разработчику несколько способов осуществления обмена сообщениями в пределах при ложения: метод Perform() (работающий независимо от API Windows), а также  функции интерфейса API Win32 SendMessage() и PostMessage().

Метод Perform()

Этим методом обладают  все потомки класса TControl, входящие в состав  библио теки VCL. Метод Perform() позволяет послать  сообщение любой форме или элемен ту управления, заданному именем экземпляра требуемого объекта. Методу Perform() передается  три   параметра —   само  сообщение  и  соответствующие  ему  параметры lParam и wParam. Определение данного метода имеет такой вид:

function TControl.Perform(Msg: Cardinal;

wParam, lParam: Longint): Longint;

Чтобы послать сообщение форме или элементу управления, применяется следую

щий синтаксис:

RetVal := ControlName.Perform(MessageID, wParam, lParam);

При  вызове функции Perform() управление вызывающей программе не возвратит ся до тех пор,  пока сообщение не будет обработано. Метод Perform() упаковывает пе реданные ему параметры в запись  типа TMessage, а затем вызывает метод Dispatch()указанного объекта, чтобы  передать сообщение, минуя  систему  передачи сообщений API Windows.  Более подробная информация о методе  Dispatch() приведена в этой главе далее.

Функции API SendMessage() и PostMessage()

Иногда возникает необходимость послать сообщение окну, для которого не сущест вует экземпляра объекта Delphi. Например, когда  требуется послать  сообщение окну, созданному не Delphi, а другой системой, и вся информация, которая доступна про грамме, —  это  его  дескриптор. Для  этого  используются  две  функции  API  Windows — SendMessage() и  PostMessage(), —  являющиеся практически идентичными, за  ис ключением того,  что первая из них,  подобно методу Perform(), посылает сообщение непосредственно процедуре окна и ожидает окончания его обработки, а функция Post- Message() просто помещает сообщение в очередь сообщений Windows  и немедленно возвращает управление вызвавшей ее программе, не дожидаясь результатов обработки.

Функции  SendMessage() и PostMessage() объявлены следующим образом:

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 — 32 бита дополнительной информации сообщения;

•  lParam — еще 32 бита дополнительной информации сообщения.

НА ЗАМЕТКУ

Хотя функции SendMessage() и PostMessage() очень похожи, они возвращают раз- личные по своему смыслу значения. Функция SendMessage() возвращает значение, полученное в результате обработки сообщения, тогда как функция PostMessage() возвращает значение типа Boolean, указывающее, удалось ли поместить сообщение в очередь сообщений соответствующего окна или нет. Иными словами, функция Send- Message() является синхронной “операцией”, а PostMessage() — асинхронной.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии