delphi 過程、函數型變量分析

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; 

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章