⒈
什麼是過程類型
把一個變量聲明爲過程類型,能夠把一個過程或函數做爲一個總體賦給這個變量或者把這個變量做爲參數傳遞給其它過程或函數。
聲明一個過程類型的語法同聲明一個過程或函數的首部語法類似,不一樣的是在保留字Procedure或function後不須要有過程或函數的標識符,中國自學編程網首發,例如:
Type
Proc1=Procedure;
Proc2=Procedure(VarX,Y:integer);
Proc3=Function(X:Double):Double;
上例中,聲明瞭三個過程類型,第一個是不帶任何參數的過程,第二個是帶兩個參數的過程,第三個是帶一個Double類型的參數並返回Double類型值的函數。
同聲明一個過程或函數同樣,您在聲明一個過程類型時能夠指定一種調用約定方式,缺省就是Register方式。
下面咱們舉例說明過程類型的用法:
Type
SwapProc=Procedure(Var X,Y:Integer);
MathFunc=Function(X:Double):Double;
{以上是類型聲明部分}
Var
P:SwapProc;
F:MathFunc;
{以上把P說明爲SwapProc 類型的變量,把F說明爲MathFunc類型的變量}
Procedure Swap(var A,B:integer);
Var
Temp:Integer;
Begin
Temp:=A;
A:=B;
B:=Temp;
End;
Function Tan(Angle:Double);
Begin
Tan:=Sin(Angle)/Cos(Angle);
End;
{以上定義了一個過程和一個函數}
P:=Swap;
F:=Tan;
{以上把Swap過程賦給P變量,把Tan函數賦給F變量}
P(I,J); {至關於調用Swap(I,J)}
X:=F(X); {至關於X:=tan(X)}
這裏舉例說明了一個過程或函數能夠賦給一個過程類型的變量,事實上過程類型的數據還能夠做爲參數傳遞給其它過程或函數。
注意:不能把過程類型直接做爲函數的返回類型,不過您可讓函數的返回類型爲指針類型,讓指針指向一個過程或函數的地址。
當把一個過程或函數賦給一個過程類型的變量時要注意賦值相容,只有知足下列條件纔是賦值相容的。
調用約定方式必須相同。
參數個數必須相同,
相應的其數據類型必須相同,但參數名不必定必須相同。
函數的返回類型必須相同。
Object Pascal規定,nil同任何過程類型相容。
過程類型根據其是否運用於對象分爲兩大類:一類是全局過程指針,另外一類是方法指針。
全局過程指針指向的是全局的過程或函數,例如上例中的SwapProc和MathFunc,這類過程類型在聲明沒有Of object 部分。
方法指針在明時必須加上Of object,表示它所指向的是一個對象的方法,程序示例以下:
Type
TNotifyEvent=Procedure (Sender:Tobject) Of Object;
有了方法指針後,要擴展一個對象,不須要從新派生出一個新的,只要把其它對象的方法賦給個這個方法指針就能夠了,這樣能夠避免對象的層次過多。
方法指針一般用於把對象的事件同一段已有的代碼(多是其它對象的)相聯繫起來,例如您想定義用戶單擊按鈕時的缺省行爲,您沒必要從 Tbutton對象派生出一個新對象並重載它的響應單擊的行爲, 您只須要把一段已有的代碼同一個方法指針聯繫起來。
方法指針的示例以下:
Type
TNotifyEvent=Procedure(Sender:Tobject) Of Object;
Type
TAnObject=Class(TObject)
FOnClick:TNotifyEvent;
End;
TAnOtherObject=Class(TObject)
Procedure AMethod(Sender:Tobject);
end;
Var
AnObject:TAnObject;
AnOtherObject:TAnotherObject; Begin AnObject:=TAnobject.Create; AnotherObject:=TAnotherObject.Create; AnObject.FOnClick:=AnotherObject.Amethod; end;