Главная » Delphi » Пользовательские сообщения

0

При разработке приложений может возникнуть ситуация, при которой приложению потребуется послать сообщение либо самому себе, либо другому пользовательскому приложению. У некоторых  предыдущее утверждение вызовет недоумение: зачем  при ложению посылать сообщение самому себе,  если  можно  просто вызвать соответствую щую процедуру?  Это  хороший вопрос, и  на  него  существует  несколько ответов. Во первых, использование сообщений представляет собой механизм поддержки реального полиморфизма, поскольку  не требует  наличия каких либо знаний о типе  объекта полу чающего сообщение. Таким  образом, технология работы с сообщениями имеет  ту же мощь,  что  и механизм виртуальных методов, но обладает существенно большей гибко стью.   Во вторых,  сообщения  допускают   необязательную  обработку —    если   объект получатель не обработает поступившее сообщение, то ничего страшного не произой дет. И, в третьих, сообщения позволяют осуществлять широковещательное обращение к нескольким получателям и организовывать параллельное прослушивание, что  доста точно трудно реализовать с помощью механизма вызова процедур.

Использование сообщений внутри приложения

Заставить приложение послать сообщение самому себе очень  просто — достаточно либо  воспользоваться функциями интерфейса API Win32 SendMessage() или Post- Message(), либо  методом Perform(). Сообщение должно  обладать идентификато ром в диапазоне от WM_USER+100 до $7FFFF (этот диапазон Windows резервирует для сообщений пользователя). Например:const

SX_MYMESSAGE = WM_USER + 100;

begin

SomeForm.Perform(SX_MYMESSAGE, 0, 0);

{ или }

SendMessage(SomeForm.Handle, SX_MYMESSAGE, 0, 0);

{ или }

PostMessage(SomeForm.Handle, SX_MYMESSAGE, 0, 0);

.

.

.

end;

Затем, для перехвата этого  сообщения, создайте обычную  процедуру обработчик, выполняющую в форме необходимые действия:

TForm1 = class(TForm)

.

.

.

private

procedure SXMyMessage(var Msg: TMessage); message SX_MYMESSAGE;

end;

procedure TForm1.SXMyMessage(var Msg: TMessage);

begin

MessageDlg(‘She turned me into a newt!’,

mtInformation, [mbOk], 0);

end;

Как видно  из примера, различия в обработке собственного сообщения и стандарт ного  сообщения Windows  невелики. Они  заключаются в использовании идентифика торов в диапазоне от WM_USER+100 и выше,  а также  в присвоении каждому сообще нию имени, которое каким то образом будет отражать его смысл.

CОВЕТ

Никогда не посылайте сообщений, значение WM_USER которых превосходит $7FFF, ес- ли не уверены абсолютно точно, что получатель способен правильно обработать это сообщение. Поскольку каждое окно может независимо выбирать используемые им значения, весьма вероятно появление трудноуловимых ошибок, если только заранее не составить таблицы идентификаторов сообщений, с которыми будут работать все отправители и получатели сообщений.

Обмен сообщениями между приложениями

При  необходимости организовать обмен  сообщениями между двумя или  более приложениями в них следует использовать функцию API RegisterWindowMessage(). Этот  метод  гарантирует, что  для заданного типа  сообщений каждое  приложение бу дет использовать один и тот же номер сообщения (message  number).

Функция RegisterWindowMessage() принимает в качестве параметра строку с за

вершающим нулевым символом и возвращает для нового сообщения идентификатор вдиапазоне $C000 – $FFFF. Это означает, что вызова  данной функции с одной  и той же строкой в качестве параметра в любом  приложении будет достаточно, чтобы  га рантировать одинаковые номера сообщений во всех приложениях, принимающих участие  в обмене. Еще одно преимущество такой  функции состоит в том, что система гарантирует  уникальность  идентификатора,  назначенного любой  заданной строке. Это  позволяет посылать широковещательные сообщения всем  существующим  в сис теме  окнам,  не  опасаясь нежелательных побочных эффектов. Недостатком данного метода  является некоторое усложнение обработки подобных сообщений. Суть заклю чается в том, что идентификатор сообщения становится известным только  при  рабо те приложения, поэтому  использование стандартных процедур обработки сообщений оказывается невозможным. Для  работы с подобными сообщениями потребуется пе реопределить  стандартные  методы   WndProc() или   DefaultHandler() элементов управления либо соответствующие процедуры класса окна.

НА ЗАМЕТКУ

Число, возвращаемое функцией RegisterWindowMessage(), создается динамически и может принимать различные значения в разных сессиях Windows, а значит, не может быть определено до момента выполнения программы.

Широковещательные сообщения

Любой  класс,  производный от класса  TWinControl, позволяет с помощью метода Broadcast() послать широковещательное сообщение (broadcast message)  любому элементу управления, владельцем которого он является. Эта технология используется в тех случа ях, когда требуется послать  одно  и то же сообщение группе  компонентов. Например, чтобы  послать  пользовательское сообщение по имени  um_Foo всем элементам управле ния, принадлежащим объекту Panel1, можно воспользоваться следующим кодом:

var

M: TMessage;

begin

with M do begin

Message := UM_FOO;

wParam := 0;

lParam := 0;

Result := 0;

end;

Panel1.Broadcast(M);

end;

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

По теме:

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