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中消息传递过程的现有过程类型?的主要内容,如果未能解决你的问题,请参考以下文章