【问题标题】:Is possible to use messages in a class procedure?可以在类过程中使用消息吗?
【发布时间】:2018-06-12 17:43:52
【问题描述】:

我想在我的程序中使用messages,但我有一个问题:我可以在class procedure 中使用消息还是在procedure 中使用messages 而不使用class

这是我的代码:

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

非常感谢。

【问题讨论】:

  • 这个问题你可以自己回答。从procedure 之前删除class 并编译,它可以工作。再次添加class,它不会。有什么不清楚的? (顺便说一句,我不是投反对票的人。只是好奇你需要澄清哪一部分。)
  • 感谢您的帮助@KenWhite。你知道我是否可以在课堂外使用procedure 捕捉messageprocedureunit?再次感谢您的支持。
  • 不,你不能。该过程必须是对象的方法才能使用message 指令。 (您可以自己再次检查。)
  • 谢谢。您能否为我发布答案以支持您的帮助?
  • @qasoft 写了一个很好的答案。您应该改为赞成该答案;它提供了比我的 cmets 更多的细节。不过,谢谢你的提议。 :-)

标签: delphi delphi-7


【解决方案1】:

关于这个话题有一篇非常好的文章: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) 所示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多