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

时间:2010-02-22 00:42:21

标签: delphi

我经常发现自己宣称一个简单的程序类型

  TMessageProc  = procedure(const AMsg: String);
在Delphi中

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

当然,这必须是Delphi编程中的常见范例。在我可以使用的常用单元之一中是否存在标准过程类型声明?不幸的是,使用roll-my-own方法,我在命名或声明类型的方式上并不完全一致。

4 个答案:

答案 0 :(得分:2)

“常见的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;

答案 1 :(得分:1)

  1. 没有这样的标准类型。
  2. 您不需要“经常声明”此类型 - 创建您自己的实用程序单元,在那里声明此类型,然后在需要此类型时使用此单元。在类型名称中使用前缀会很好,因此您的类型名称不会与其他名称交叉一次。例如 - TLLMessageProc。
  3. 如果您经常在程序UI回调中使用此类方法,那么您可以考虑将其替换为某个界面,实现不同的UI回调,根据您的应用程序需要实现它等。通常,它可以改善您的代码。

答案 2 :(得分:0)

您可以使用classes.pas

中的标准事件类型
{ Standard events }

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

或定义自己的。

答案 3 :(得分:0)

您可以使用SysUtils中的TProc