⒈什么是過程類型 把一個變量聲明為過程類型,可以把一個過程或函數(shù)作為一個整體賦給這個變量或者把這個變量作為參數(shù)傳遞給其它過程或函數(shù)。 聲明一個過程類型的語法同聲明一個過程或函數(shù)的首部語法相似,不同的是在保留字Procedure或fun- ction后不需要有過程或函數(shù)的標(biāo)識符,中國自學(xué)編程網(wǎng)首發(fā),例如: Type Proc1=Procedure; Proc2=Procedure(VarX,Y:integer); Proc3=Function(X:Double):Double; 上例中,聲明了三個過程類型,第一個是不帶任何參數(shù)的過程,第二個是帶兩個參數(shù)的過程,第三個是帶一個Double類型的參數(shù)并返回Double類型值的函數(shù)。 同聲明一個過程或函數(shù)一樣,您在聲明一個過程類型時可以指定一種調(diào)用約定方式,缺省就是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; {以上定義了一個過程和一個函數(shù)} P:=Swap; F:=Tan; {以上把Swap過程賦給P變量,把Tan函數(shù)賦給F變量} P(I,J); {相當(dāng)于調(diào)用Swap(I,J)} X:=F(X); {相當(dāng)于X:=tan(X)} 這里舉例說明了一個過程或函數(shù)可以賦給一個過程類型的變量,事實上過程類型的數(shù)據(jù)還可以作為參數(shù)傳遞給其它過程或函數(shù)。 注意:不能把過程類型直接作為函數(shù)的返回類型,不過您可以讓函數(shù)的返回類型為指針類型,讓指針指向一個過程或函數(shù)的地址。 當(dāng)把一個過程或函數(shù)賦給一個過程類型的變量時要注意賦值相容,只有滿足下列條件才是賦值相容的。 調(diào)用約定方式必須相同。 參數(shù)個數(shù)必須相同,相應(yīng)的其數(shù)據(jù)類型必須相同,但參數(shù)名不一定必須相同。 函數(shù)的返回類型必須相同。 Object Pascal規(guī)定,nil同任何過程類型相容。 過程類型根據(jù)其是否運用于對象分為兩大類:一類是全局過程指針,另一類是方法指針。 全局過程指針指向的是全局的過程或函數(shù),例如上例中的SwapProc和MathFunc,這類過程類型在聲明沒有Of object 部分。 方法指針在明時必須加上Of object,表示它所指向的是一個對象的方法,程序示例如下: Type TNotifyEvent=Procedure (Sender:Tobject) Of Object; 有了方法指針后,要擴展一個對象,不需要重新派生出一個新的,只要把其它對象的方法賦給個這個方法指針就可以了,這樣可以避免對象的層次過多,m.jdtbank.com 。 方法指針通常用于把對象的事件同一段已有的代碼(可能是其它對象的)相聯(lián)系起來,例如您想定義用戶單擊按鈕時的缺省行為,您不必從 Tbutton對象派生出一個新對象并重載它的響應(yīng)單擊的行為, 您只需要把一段已有的代碼同一個方法指針聯(lián)系起來。 方法指針的示例如下: 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; 您現(xiàn)在的位置:首頁--開發(fā)語言--DELPHI編程--DELPHI基礎(chǔ)--瀏覽文章 delphi過程類型基礎(chǔ)學(xué)習(xí)
點擊:220 發(fā)布日期:2007-11-27 20:07:24 進(jìn)入論壇
AnOtherObject:TAnotherObject; Begin AnObject:=TAnobject.Create; AnotherObject:=TAnotherObject.Create; AnObject.FOnClick:=AnotherObject.Amethod; end;
|