Delphi自定义消息处理程序

Jos*_*ons 3 delphi windows-messages

当用户双击dbgrid时,我会显示一个非模态表单.

当他们关闭那个表格时,我想刷新网格.

为此,我尝试了以下方法:

1 - 定义自定义消息常量:

const
  WM_REFRESH_MSG = WM_USER + 1;  //defined in a globally available unit
Run Code Online (Sandbox Code Playgroud)

2 - 在我的非模态形式的OnClose事件中,我有:

procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;
Run Code Online (Sandbox Code Playgroud)

3 - 在包含dbGrid的表单的私有声明中,我有:

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

...

procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
  RefreshGrid;
end;
Run Code Online (Sandbox Code Playgroud)

执行这些操作后,PostMessage会触发,但OnRefreshRequest过程永远不会运行.我究竟做错了什么?

Fre*_*man 8

请注意,WM_USER不是基于您自己的消息的正确常量,除非您正在编写直接从TWinControl降序的自定义控件.请改用WM_APP.

此外,将UM_用于用户消息而不是WM_被认为是好的风格,因为该前缀应该为Windows头文件保留.


Jim*_*Jim 6

除了另一个答案中的消息名称,您在Self离开时向Self.Handle发送消息.您可能想要发布到不同的句柄(启动无模式窗口的窗口).在创建时,让您的无模式窗口访问该句柄,并在那里发布消息.