Delphi - How do I send a windows message to TDataModule?
Asked Answered
G

2

7

I need to send a windows message to a TDataModule in my Delphi 2010 app.

I would like to use

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

Question:

The TDataModule does not have a Handle. How can I send a windows message to it?

Gosney answered 23/8, 2010 at 20:34 Comment(0)
M
11

You can give it a handle easily enough. Take a look at AllocateHWND in the Classes unit. Call this to create a handle for your data module, and define a simple message handler that will process UM_LOG_ON_OFF.

Montgolfier answered 23/8, 2010 at 20:58 Comment(4)
Does AllocateHWND just create a hidden window?Kumar
@gbrandt: It creates a window handle, which is not quite the same thing. All visual controls must have a window handle in order to receive messages and handle their own drawing, (and visual controls without a handle can't draw themselves or receive messages,) but not every handle neds to be bound to a visual element.Montgolfier
@gbrandt: Have a look at this link delphidabbler.com/articles?article=1 on "How a non-windowed component can receive messages from Windows"Gosney
Note that the AllocateHWND of the Forms unit is deprecated. Use the one available in Classes instead. And yes, AllocateHWND creates an hidden window, but in the sense of the Windows API, not in the sense of a Delphi TForm: this window is an API handle, which is used to receive GDI messages.Semi
T
1

Here is an example demonstrating how to create a TDataModule's descendant with an Handle

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;

Then we can send messages to the datamodule, like this:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(MyDataModule.Handle, uMyDataModule.UM_TEST, 0, 0);
end;
Toothy answered 17/2, 2021 at 9:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.