{
This is useful if you want to send a message from your DLL back
to the calling application.
}const
MY_MESSAGE = WM_USER + 4242;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
// Handler that receive the Message procedure MessageReceiver(var msg: TMessage); message MY_MESSAGE;
end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
txt: string;
begin
txt := 'Hello World';
SendMessage(Form1.Handle, MY_MESSAGE, 0, DWORD(PChar(txt)));
end;
// To receive this custom Message that is addressed to form1.handle // you need a message handler. procedure TForm1.MessageReceiver(var msg: TMessage);
var
txt: PChar;
begin
txt := PChar(msg.lParam);
msg.Result := 1;
ShowMessage(txt);
end;
end.
Это фрагмент кода на Delphi, демонстрирующий использование функции SendMessage для отправки пользовательского сообщения из DLL обратно в вызывающую приложение.
Константы и типы
MY_MESSAGE: константа, определенная как WM_USER + 4242, которая является уникальным идентификатором для пользовательского сообщения.
TForm1: класс, представляющий форму с кнопкой и двумя процедурами: Button1Click и MessageReceiver.
PChar: тип alias для указателя на символ (строку).
Переменные
Form1: экземпляр класса TForm1.
Имплементация
Процедура Button1Click:
Эта процедура вызывается при клике кнопки.
Она устанавливает строковую переменную txt в значение "Hello World".
Затем она использует функцию SendMessage для отправки пользовательского сообщения (MY_MESSAGE) формой с указателем на строку txt в параметре lParam.
Процедура MessageReceiver:
Это обработчик сообщений, получающий пользовательское сообщение, отправленное процедурой Button1Click.
Она извлекает строку из параметра lParam с помощью типкаста PChar.
Затем она устанавливает свойство Result объекта TMessage в значение 1 и отображает сообщение с полученной строкой.
Как это работает
Когда кнопка кликается, процедура Button1Click отправляет пользовательское сообщение (MY_MESSAGE) форме с строкой "Hello World" как payload. Обработчик сообщений MessageReceiver получает это сообщение и извлекает строку из параметра lParam. Затем она отображает сообщение с полученной строкой.
Это код демонстрирует использование функции SendMessage для отправки пользовательских сообщений между компонентами в приложении Delphi, что может быть полезно для коммуникации между разными частями приложения или даже между несколькими приложениями.
Альтернативное решение
Вместо использования функции SendMessage, можно также использовать события и уведомления для коммуникации между компонентами. Например, можно создать обработчик событий, который вызывается при клике кнопки, и затем использовать этот обработчик для уведомления других компонентов о действии.
Например:
typeTForm1=class(TForm)Button1:TButton;procedureButton1Click(Sender:TObject);end;varForm1:TForm1;implementationprocedureTForm1.Button1Click(Sender:TObject);begin// Уведомить другие компоненты о клике кнопкиNotification('ButtonClicked');end;// Другие компоненты могут получать это уведомление и реагировать соответственноprocedureTForm2.Notification(constMsg:string);begin// Обработать уведомление здесьShowMessage(Msg);end;
В этом примере, когда кнопка кликается, она вызывает обработчик событий, который отправляет уведомление другим компонентам. Эти компоненты могут затем получать это уведомление и реагировать соответственно. Это подход более декуплированный, чем использование пользовательских сообщений, и проще в обслуживании.
Пересылка сообщения в вызывающую программу с помощью SendMessage позволяет отправить из динамической библиотеки (DLL) сообщение обратно в приложение, которое его вызвало.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS