可以在类过程中使用消息吗?

时间:2016-02-04 17:27:04

标签: delphi delphi-7

我想在我的程序中使用messages,我有一个问题:我可以在class procedure中使用消息吗?或者我可以在messages中使用procedure而不使用class {1}}?

这是我的代码:

const

  WM_CUSTOM_TCP_CLIENT = WM_USER + 10;

type
    TFeedbackEvent = class
      public
        class procedure feedback(var msg: TMessage); message WM_CUSTOM_TCP_CLIENT;
      end;

Delphi返回以下消息:

[Error] unit.pas(33): Invalid message parameter list

非常感谢。

1 个答案:

答案 0 :(得分:9)

关于这个主题有一篇非常好的文章:Handling Messages in Delphi 6。这是必读的。

  

处理或处理消息意味着您的应用程序会响应   以某种方式对Windows消息。在标准的Windows中   应用程序,消息处理在每个窗口过程中执行。

     

然而,通过内化窗口过程,Delphi做得很多   更容易处理个人信息;而不是一个程序   处理所有消息,每个消息都有自己的过程。三   要成为消息处理的过程必须满足要求   过程:

     
      
  • 程序必须是对象的方法。

  •   
  • 该过程必须采用TMessage的一个var参数或其他特定于消息的记录类型。

  •   
  • 该过程必须使用message指令,后跟要处理的消息的常量值。

  •   

正如您在文章中所读到的,该过程必须是对象的方法,而不是类。所以你不能只在类过程中使用消息处理程序。

处理类实例(也在对象实例或无窗口应用程序中)中的消息的可能解决方法是通过AllocateHWND手动创建窗口句柄,并通过WndProc过程自行处理消息。

在delphi.about.com上有一个很好的例子:Sending messages to non-windowed applications (Page 2)

以下示例是上述示例的一个版本,经过修改后可以使用类方法。 (如果确实不需要使用类方法,请使用上面链接中的原始示例):

首先,您需要声明一个窗口句柄字段和一个WndProc过程:

TFeedbackEvent = class
private
  FHandle: HWND;
protected
  class procedure ClassWndProc(var msg: TMessage); 
end;

procedure WndProc(var msg: TMessage); 

然后,手动处理消息:

procedure WndProc(var msg: TMessage); 
begin
    TFeedbackEvent.ClassWndProc(msg);
end;

procedure TFeedbackEvent.ClassWndProc(var msg: TMessage);
begin
  if msg.Msg = WM_CUSTOM_TCP_CLIENT then
    // TODO: Handle your message
  else
    // Let default handler process other messages
    msg.Result := DefWindowProc(FHandle, msg.Msg, msg.wParam, msg.lParam);
end;

最后,在文件末尾,声明初始化和终结部分以创建/销毁句柄:

initialization
    FHandle := AllocateHWND(WndProc);

finalization
    DeallocateHWnd(FHandle);

当然,这不是推荐的方法(尤其是关注初始化/终结的问题),这只是一个示例,表明它是可能的。

除非你有一些非常奇怪的要求使用类方法,否则最好使用常规类方法和对象构造函数和析构函数来代替初始化和终结部分(如Sending messages to non-windowed applications (Page 2)所示)。