题
当一个用户双击一个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程序运行从来没有。我在做什么错了?
解决方案
除了从对方的回答报文的名字,你虽然自会消失发布消息Self.Handle。你可能是要发布到不同的手柄(即推出了无模式的一个窗口)。给到处理您的模式窗口,访问时,您有创建,并张贴讯息。
其他提示
请注意WM_USER不是立足于自己的消息,除非你正在写一个自定义的控制从TWinControl直接降正确的常量。使用WM_APP代替。
此外,它被认为是良好的风格来使用UM_用户信息,而不是WM_因为前缀应该被保留为Windows头文件。
需要的交消息被发送到另一窗口句柄,而不是已列出的self.handle。这样做的一个方法是创建非模态窗体的新属性,并指定它的另一形式的手柄您展示非模态一个之前。
除此之外,妥善实施WM_REFRESH_MSG(CheGueVerra有它正确的),它应该工作的罚款。
您可以尝试和改变声明的末尾,以配合您要发送的消息。
procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;
应该是这
procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;
我上传的一个例子“你会凯文怎么办?”到Embarcadero公司的新闻组论坛embarcadero.public.attachments。
基本上它是一个自定义事件的主要形式(或任何形式/对象要)预订当非模式窗体关闭。在主(或其他)形式...
var
NonModalForm :TfmNonModalForm;
begin
NonModalForm := TfmNonModalForm.Create(nil);
NonModalForm.Execute(NonModalFormClosingListener);
在Execute方法
procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
FHeyIClosedEvent := YourListenerMethod;
Show();
end;
如果你不能到论坛,并需要额外的代码,发表评论,我会发布缺少的部分。
好运