Delphi自定义消息处理程序

时间:2009-05-13 20:03:50

标签: delphi windows-messages

当用户双击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过程永远不会运行。我做错了什么?

5 个答案:

答案 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;

如果您无法访问论坛并需要其他代码,请发表评论,我会发布丢失的内容。

祝你好运