Delphi中消息传递过程的现有过程类型?

Posted

技术标签:

【中文标题】Delphi中消息传递过程的现有过程类型?【英文标题】:Existing procedure type for a messaging procedure in Delphi? 【发布时间】:2010-02-22 00:42:20 【问题描述】:

我经常发现自己声明了一个简单的过程类型

  TMessageProc  = procedure(const AMsg: String);

在德尔福。目的是允许将回调过程传递给处理函数,以便它们可以更新用户界面而无需了解用户界面。

这肯定是 Delphi 编程中常见的范式。在我可以使用的常用单元之一中是否存在标准过程类型声明?不幸的是,使用自己滚动的方法,我命名或声明类型的方式在项目之间并不完全一致。

【问题讨论】:

【参考方案1】:

“常见的 Delphi 范例”是事件(事件处理程序)。例如,你可以写

type
  TMessageProc  = procedure(const AMsg: String);

procedure DoSomething(OnProgress: TMessageProc);
begin
//  ...
  if Assigned(OnProgress) then OnProgress('123');
//  ...
end;

通常Delphi中的事件都是作为方法实现的,所以上面例子的标准Delphi代码是:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
     Private declarations 
    procedure ShowProgress(const AMsg: String);
  public
     Public declarations 
  end;

var
  Form1: TForm1;

implementation

$R *.dfm

type
  TMessageProc  = procedure(const AMsg: String) of object;  // declare event type

procedure DoSomething(OnProgress: TMessageProc);
begin
//  ...
  if Assigned(OnProgress) then OnProgress('123');   // trigger event
//  ...
end;

procedure TForm1.ShowProgress(const AMsg: String);  // event handler
begin
  Label1.Caption:= AMsg;
  Application.ProcessMessages;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoSomething(ShowProgress);
end;

声明您的个人事件类型并没有错,但请确保您可以在 VCL 中找到标准事件。例如,classes.pas 单元包含声明

  TGetStrProc = procedure(const S: string) of object;

【讨论】:

【参考方案2】:
    没有这样的标准类型。 您不需要“经常声明”此类型 - 创建您自己的实用单元,在此处声明此类型,然后在需要此类型时使用此单元。最好在类型名称中使用前缀,这样您的类型名称就不会与其他名称交叉一次。例如 - TLLMessageProc。 如果您经常将这种方法与过程 UI 回调一起使用,那么您可以考虑将其替换为一些接口,实现不同的 UI 回调,根据您的应用程序的需要实现它等。总的来说,它可能会改善您的代码。

【讨论】:

【参考方案3】:

您可以使用来自classes.pas 的标准事件类型

 Standard events 

TNotifyEvent = procedure(Sender: TObject) of object;
TGetStrProc = procedure(const S: string) of object;

或定义你自己的。

【讨论】:

【参考方案4】:

您可以使用来自 SysUtils 的TProc。

【讨论】:

以上是关于Delphi中消息传递过程的现有过程类型?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi - 将记录作为窗口消息发送

#yyds干货盘点# 如何处理消费过程中的重复消息?

响应者链的事件传递过程

windows的消息传递--消息盒子

在两个进程之间传递消息

Marshall结构通过sendmessage将其传递给delphi记录