Procedure型變量:
在DELPHI中,函數、過程的地址可以賦給一個特殊類型的變量,變量可用如下方式聲明:
var p : procedure(num:integer); //過程
或:
var f : function(num:integer):integer; //函數
也可定義一個過程(或函數)類型,再定義該類型的變量,如:
type TMyProc = Procedure(num:integer);
var p : TMyProc;
example:
type TMyProc= procedure (filename : string); //定義過程類型
procedure clearfile(filename : string);
begin
{….}
end ;
…
var p:TMyProc; //定義過程變量
…
p := clearfile; //將具體實現的過程地址賦給過程變量
…
p(‘log.dat’); //調用過程
…
可以將該類型的變量賦nil表示清除。
通過這種方式定義函數或過程的變量十分有用,如可用於裝入動態鏈接庫、根據不同的條件調用不同的過程等。
Method型變量:
在DELPHI中還有一種特殊的過程,叫做方法(method),在定義方法類型的時候要在過程定義的後面加上 of object,如:
type TMyMethod=Procedure(num:integer) of object;
同樣也可定義過程類型的變量:
var m : TMyMethod;
可以將該類型的變量賦nil表示清除。
方法類型常用於類定義中的事件定義,如控件中常用的OnClick事件,它的類型定義如下:
type TNotifyEvent=Procedure(Sender : TObject) of object;
區別:
procedure與method的定義雖然很相似,但兩者並不一樣,也不通用,不能互相賦值。procedure型變量是一個指針指向實際的代碼地址,而method型變量實際是一對指針,第一個指向代碼的地址,第二個指向包含該代碼的類的一個實例。區別一個過程是否是方法就看它是否屬於一個類的成員。
Example:
Type
TMyProc=Procedure(str : String); //定義普通過程類型
TMyMethod=Procedure(str : String) of object; //定義方法類型
…
//下面的代碼是一個普通的過程
Procedure Proc1(str : String);
Begin
ShowMessage(str);
End;
…
//下面的代碼是一個方法
Procedure TForm1.Proc2(str : String);
Begin
ShowMessage(str);
End;
…
var p : TMyProc;
m : TMyMethod;
…
p := Proc1; //正確
m := Proc2; //正確
p := Proc2; //錯誤!
m := Proc1; //錯誤!
在類型定義中,類型的屬性(如事件)常用以下方式定義在published關鍵字後,如:
property OnClick : TNotifyEvent read FOnClick write FOnClick; //FOnClick爲類的方法型私有成員變量
但published關鍵字後的屬性不能是普通的過程類型。普通過程類型只能在類的private、public、protected成員中。而方法類型可以是類的任何類型成員。
Example:
Type
TMyClass = class(TObject)
Private
FOnMyMethod: TMyMethod;
FOnMyProc : TMyProc;
Public
Property OnMyProc1 : TMyProc read FOnMyProc write FOnMyProc; //正確
Published
Property OnMyMethod : TMyMethod read FOnMyMethod write FOnMyMethod; //正確
Property OnMyProc2 : TMyProc read FOnMyProc write FOnMyProc; //錯誤!
End;