当一个用户双击一个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;

如果你不能到论坛,并需要额外的代码,发表评论,我会发布缺少的部分。

好运

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top