我经常发现自己宣称一个简单的程序类型
TMessageProc = procedure(const AMsg: String);
在Delphi中目的是允许将回调过程传递给处理函数,以便他们可以更新用户界面而无需了解用户界面。
当然,这必须是Delphi编程中的常见范例。在我可以使用的常用单元之一中是否存在标准过程类型声明?不幸的是,使用roll-my-own方法,我在命名或声明类型的方式上并不完全一致。
答案 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)
答案 2 :(得分:0)
您可以使用classes.pas
{ Standard events }
TNotifyEvent = procedure(Sender: TObject) of object;
TGetStrProc = procedure(const S: string) of object;
或定义自己的。
答案 3 :(得分:0)
您可以使用SysUtils中的TProc。