КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
[Главная страница] [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. Профессиональное программирование. Дмитрий Осипов.