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过程永远不会运行.我究竟做错了什么?
请注意,WM_USER不是基于您自己的消息的正确常量,除非您正在编写直接从TWinControl降序的自定义控件.请改用WM_APP.
此外,将UM_用于用户消息而不是WM_被认为是好的风格,因为该前缀应该为Windows头文件保留.
除了另一个答案中的消息名称,您在Self离开时向Self.Handle发送消息.您可能想要发布到不同的句柄(启动无模式窗口的窗口).在创建时,让您的无模式窗口访问该句柄,并在那里发布消息.