当用户双击dbgrid时,我会显示非模态表单。
当他们关闭那个表格时,我想刷新网格。
为实现这一目标,我尝试了以下方法:
1 - 定义自定义消息常量:
const
WM_REFRESH_MSG = WM_USER + 1; //defined in a globally available unit
2 - 在我的非模态形式的OnClose事件中,我有这个:
procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;
3 - 在包含dbGrid的表单的私有声明中,我有:
procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
...
procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
RefreshGrid;
end;
执行这些操作后,PostMessage会触发,但OnRefreshRequest过程永远不会运行。我做错了什么?
答案 0 :(得分:8)
请注意,WM_USER不是基于您自己的消息的正确常量,除非您正在编写直接从TWinControl降序的自定义控件。改为使用WM_APP。
此外,将UM_用于用户消息而不是WM_被认为是好的风格,因为该前缀应该为Windows头文件保留。
答案 1 :(得分:6)
除了另一个答案中的消息名称之外,当Self正在消失时,您正在向Self.Handle发送消息。您可能想要发布到不同的句柄(启动无模式窗口的窗口)。在创建时,让您的无模式窗口访问该句柄,并在那里发布消息。
答案 2 :(得分:2)
邮件消息需要发送到其他窗口句柄,而不是您列出的self.handle。一种方法是在非模态窗体上创建一个新属性,并在显示非模态窗体之前为其指定另一个窗体的句柄。
除此之外,正确实施WM_REFRESH_MSG(CheGueVerra使其正确)它应该可以正常工作。
答案 3 :(得分:1)
您可以尝试更改声明的结尾以匹配您尝试发送的消息。
procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;
应该是这个
procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
答案 4 :(得分:1)
我上传了一个“凯文会做什么?”的例子。到Embarcadero的新闻组论坛embarcadero.public.attachments。
基本上,这是一个自定义事件,当非模态表单关闭时,主表单(或您想要的任何表单/对象)订阅。主要(或其他)形式...
var
NonModalForm :TfmNonModalForm;
begin
NonModalForm := TfmNonModalForm.Create(nil);
NonModalForm.Execute(NonModalFormClosingListener);
在执行方法
中procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
FHeyIClosedEvent := YourListenerMethod;
Show();
end;
如果您无法访问论坛并需要其他代码,请发表评论,我会发布丢失的内容。
祝你好运