КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
[Главная страница] [Delphi] [Контакты]
Для демонстрации процесса обмена сообщениями спроектируем два небольших приложения: первое – приемник, второе – отправитель сообщений. Начнем с приема.
Создайте новое приложение и сохраните его в отдельный каталог под именем receiver.dpr. Приложение не содержит ни одного элемента управления и его листинг включает лишь секцию инициализации и две процедуры:
unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TfrmMain = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } procedure OnMessage_Event(var Msg: TMsg; var Handled: Boolean); public { Public declarations } end; var frmMain: TfrmMain; WM_MSG1, WM_MSG2 : Cardinal; //здесь будем хранить идентификаторы сообщений implementation {$R *.dfm} { TfrmMain } procedure TfrmMain.FormCreate(Sender: TObject); begin Application.OnMessage := OnMessage_Event; end; procedure TfrmMain.OnMessage_Event(var Msg: TMsg; var Handled: Boolean); begin Handled := True; if Msg.message = WM_MSG1 then ShowMessage('Сообщение от sender: WM_MSG1') else if Msg.message = WM_MSG2 then ShowMessage('Сообщение от sender: WM_MSG2') else Handled:=False; end; initialization {регистрация в Windows двух пользовательских сообщений} WM_MSG1 := RegisterWindowMessage('WM_MSG1'); WM_MSG2 := RegisterWindowMessage('WM_MSG2'); end.
В момент инициализации приложение регистрирует два пользовательских сообщения, а результаты регистрации помещает в две переменные WM_MSG1 и WM_MSG2. Обслуживанием поступающих сообщений занимается процедура OnMessage_Event(). Тело процедуры содержит код, определяющий реакцию приложения на поступление пользовательских сообщений. Эта процедура активизируется во время создания главной формы; в этот момент указывается, что обработка события OnMessage() перенаправляется в процедуру OnMessage_Event(). Откомпилируйте и сохраните проект приемника.
Переходим к разработке программы передатчика сообщений. Создайте новое приложение и разместите на поверхности главной формы две кнопки Button1 и Button2. Повторите исходный код, предложенный в следующем листинге:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; WM_MSG1, WM_MSG2 : Cardinal; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var h:hWnd; begin h := FindWindow(nil, 'receiver'); // поиск главного окна приложения // с названием receiver if h > 0 then // если окно обнаружено PostMessage(h, WM_MSG1, Application.Handle, 0); // отправляем ему // сообщение WM_MSG1 end; procedure TForm1.Button2Click(Sender: TObject); var h: hWnd; begin h := FindWindow(nil, 'receiver'); if h > 0 then PostMessage(h, WM_MSG2, Application.Handle, 0); end; initialization {регистрация в Windows двух пользовательских сообщений} WM_MSG1 := RegisterWindowMessage('WM_MSG1'); WM_MSG2 := RegisterWindowMessage('WM_MSG2'); end.
Программа-передатчик регистрирует сообщения, идентичные описанным в коде проекта receiver.dpr. Это гарантирует, что программа-приемник будет «общаться» с передатчиком на одном языке. В обработчике события OnClick() первой кнопки при помощи функции FindWindow() осуществляется поиск главного окна приложения с именем «receiver», и, если оно обнаружено, в адрес этого окна (с помощью функции PostMessage()) отправляется соответствующее пользовательское сообщение.
Исходный код проекта (Delphi XE)
Используемая литература: Delphi. Профессиональное программирование. Дмитрий Осипов.