delphi - 如何从另一个单元调用一个过程(处理消息)?

标签 delphi

我想要我的程序 WMInput(var Mess: TMessage); message WM_INPUT; 放置在单独的单元中。

我应该在其他单元中以相同的方式声明它(我问原型(prototype)是否仍然是相同的procedure WMInput(var Mess: TMessage); message WM_INPUT;)?
我怎么称呼这个? 以下内容可以接受吗?

procedure WMInput(var Msg: TMessage)
begin
FUnit:= Fotherunit.create(self);
FUnit.WMInput(Msg);
end;

还有其他选择吗?

最佳答案

消息处理程序是方法,因此它们必须在与其所属类相同的单元中声明和实现。

但这并不能阻止您将实际工作委派给另一个单元中的其他职能。在这方面,消息处理程序没有什么特别的。声明您喜欢的任何函数,并向其传递完成其职责所需的任何参数。如果它需要的只是 TMessage 记录的内容,那就这样吧。但是,它可能还需要知道什么形式收到了消息,因此也传递对此的引用。或者也许它只需要知道某些表单私有(private)字段的值,因此可以传递这些值。

您可以制作一个用于处理消息的单元。它的界面部分可能如下所示:

unit MessageHandlers;

interface

uses OtherUnit;

procedure HandleWMInput(Form: FOtherUnit; var Message: TWMInput);

没有任何东西可以指定该函数处理 wm_Input 消息; message 指令仅适用于类。

然后,表单单元的实现部分可以使用该单元并调用其函数:

uses MessageHandlers;

procedure FOtherForm.WMInput(var Message: TWMInput);
begin
  HandleWMInput(Self, Message);
end;
<小时/>

我使用了TWMInput而不是TMessage。如果 Delphi 尚未为您声明该类型(在 Messages.pas 中),那么我建议您自己声明它。它让 Delphi 为您执行消息参数破解。例如,通过下面的声明,原始输入句柄比 TMessage 中的相应字段具有更好的类型和名称。

type
  TWMInput = packed record
    Msg: Cardinal;
    InputCode: Byte;
    Unused: array[0..2] of Byte;
    RawInput: HRawInput;
    Result: LongInt;
  end;

关于delphi - 如何从另一个单元调用一个过程(处理消息)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333499/

相关文章:

delphi - delphi 无效参数

Delphi:使组件对实时绑定(bind)可见

C 到 Delphi/Pascal

Delphi 正确定位与 ListView 项关联的气球提示

delphi - Delphi 中对象委托(delegate)的共同祖先

delphi - Delphi 的 NURBS 库

delphi - Delphi 中定义常量时出错

德尔福;传递 const 字符串与传递 var 字符串的性能

delphi - Delphi中if语句的求值顺序

delphi - Indy SMTP Connect 在不同 PC 上的处理方式不同