Delphi - 如何向 TDataModule 发送 Windows 消息?

7

我需要在我的 Delphi 2010 应用程序中向 TDataModule 发送一个 Windows 消息。

我想要使用

PostMessage(???.Handle, UM_LOG_ON_OFF, 0,0);

问题:

TDataModule没有Handle,我如何向它发送Windows消息?

2个回答

10

你可以很容易地给它提供一个句柄。查看“Classes”单元中的“AllocateHWND”。调用该函数可为数据模块创建一个句柄,并定义一个简单的消息处理程序来处理UM_LOG_ON_OFF。


AllocateHWND只是创建了一个隐藏的窗口吗? - Gregor Brandt
它创建了一个“窗口句柄”,但并非完全相同。所有可视控件必须具有窗口句柄才能接收消息并处理它们自己的绘制(没有句柄的可视控件无法绘制自己或接收消息),但并非每个句柄都需要绑定到可视元素上。 - Mason Wheeler
1
@gbrandt:看看这个链接 http://www.delphidabbler.com/articles?article=1 关于“非窗口组件如何接收来自Windows的消息” - Charles Faiga
4
请注意,Forms单元的AllocateHWND已被弃用,请改用Classes中可用的方法。是的,AllocateHWND会创建一个隐藏的窗口,但这里所说的是Windows API的意义,而不是Delphi表单的意义:该窗口是一个API句柄,用于接收GDI消息。 - A.Bouchez

1
这是一个示例,演示如何创建一个带有HandleTDataModule的子类。
uses
  Windows, Winapi.Messages,
  System.SysUtils, System.Classes;

const
  UM_TEST = WM_USER + 1;

type
  TMyDataModule = class(TDataModule)
  private
    FHandle: HWND;
  protected
    procedure   WndProc(var Message: TMessage); virtual;
  public
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy(); override;
    property    Handle : HWND read FHandle;
  end;

...

uses
  Vcl.Dialogs;

constructor TMyDataModule.Create(AOwner : TComponent);
begin
  inherited;

  FHandle := AllocateHWND(WndProc);
end;

destructor  TMyDataModule.Destroy();
begin
  DeallocateHWND(FHandle);

  inherited;
end;

procedure   TMyDataModule.WndProc(var Message: TMessage);
begin
  if(Message.Msg = UM_TEST) then
  begin
    ShowMessage('Test');
  end;
end;

然后我们可以像这样向数据模块发送消息:
procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(MyDataModule.Handle, uMyDataModule.UM_TEST, 0, 0);
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接