gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:08:26 29 4
gpt4 key购买 nike

我想要我的程序 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com