2010-02-22 75 views
3

我經常發現自己在德爾福宣佈一個簡單的程序類型Delphi中的消息傳遞過程的現有過程類型?

TMessageProc = procedure(const AMsg: String); 

。其目的是允許將回調過程傳遞給處理函數,以便他們可以更新用戶界面而不必知道用戶界面。

這肯定是Delphi編程中的一個常見範例。在我可以使用的常用單位之一中是否存在標準的過程類型聲明?不幸的是,通過我自己的方法,我在名稱或聲明類型的方式之間的項目之間並不完全一致。

回答

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單元containes聲明

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

事件不是方法;他們是方法指針。 – vcldeveloper 2010-02-22 08:35:25

1
  1. 沒有這樣的標準類型。
  2. 您不需要「經常聲明」這種類型 - 創建您自己的公用事業單位,在那裏聲明此類型,然後在需要此類型時使用此單位。在類型名稱中使用前綴會很好,所以您的類型名稱不會與其他名稱交叉。例如 - TLLMessageProc。
  3. 如果你經常在過程UI回調中使用這種方法,那麼你可以考慮用一些接口替換它,實現不同的UI回調,根據你的應用需要實現它,等等。一般來說,它可以提高你的碼。
0

可以使用非標準的事件類型從classes.pas

{ Standard events } 

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

或定義自己。

0

您可以使用SysUtils的TProc