二、控件開(kāi)發(fā)縱覽
? 通過(guò)開(kāi)發(fā)上邊這個(gè)控件,我們已經(jīng)對(duì)Delphi控件開(kāi)發(fā)有了基本的認(rèn)識(shí)。下面我們將系統(tǒng)的講述一下控件開(kāi)發(fā)的知識(shí)。
制作控件第一件事就是選擇適當(dāng)?shù)?Delphi對(duì)象類(lèi)型作為父對(duì)象,以派生新的對(duì)象。子對(duì)象可以繼承父對(duì)象的全部非 private部件,但不能擺脫不需要的部件。因此,所選父對(duì)象應(yīng)盡可能多地包含子對(duì)象所需的屬性、事件和方法,但不應(yīng)包含子對(duì)象不需要的東西。Delphi必須從Tcomponent或Tcomponent的子類(lèi)派生。TComponent是所有 Delphi控件的基點(diǎn),但若直接從 TComponent 派生新控件,很多東西就需要自己從頭做起。一般只有非可視控件才直接從 TComponent派生。 Delphi提供了若干專(zhuān)門(mén)用于制作控件(可視控件)的對(duì)象類(lèi)型,都是從 TControl和 TWinControl派生而來(lái)。
TControl的子類(lèi)型用于非窗口式控件, TWinControl的子類(lèi)型則用于窗口式控件。除非特殊需要,一般不直接從 TControl和TWinControl派生新控件,而是從其子類(lèi)型派生。這樣可以充分利用原有的屬性、事件和方法,減少很多工作量。在這些控件類(lèi)型中,非通用的屬性、事件和方法都聲明為 protected。這樣可以禁止控件用戶(hù)訪問(wèn),又能被子類(lèi)型繼承和修改。在新控件中,可以簡(jiǎn)單地把繼承來(lái)的屬性和事件重新聲明為 published,使控件用戶(hù)能在設(shè)計(jì)期通過(guò)對(duì)象編輯窗口訪問(wèn),也可以進(jìn)而修改屬性的默認(rèn)值和讀寫(xiě)方式,或是重載( override)事件處理子過(guò)程和其他控件方法,以修改其中的程序代碼。重聲明可以放寬訪問(wèn)權(quán)限,但不能相反,例如,不可能把 published屬性重聲明為 private或 protected。
?Delphi控件也是Delphi的類(lèi),所有的控件都有特定的結(jié)構(gòu)。一般控件包括三大組成部分:屬性、方法和事件,下面先介紹初學(xué)控件開(kāi)發(fā)的最難懂的屬性部分,其他部分我們將在以后章節(jié)為大家介紹。
屬性主要部分就是屬性的讀寫(xiě)方法(或讀寫(xiě)字段)。前面的例子用的是讀寫(xiě)字段,也就是對(duì)屬性的讀寫(xiě)都通過(guò)對(duì)字段的讀寫(xiě)來(lái)完成。下面為大家講解一下讀寫(xiě)方法的使用方法:
TmyComponent = class(TComponent)
Private
? Fcount: Integer;
? Procedure SetCount(Avalue: Integer);
Pulbished
? Property Count: Integer read Fcount write SetCount;
End;
這個(gè)例子中當(dāng)執(zhí)行MyComponent1.Count := 1;這樣的代碼時(shí),將會(huì)導(dǎo)致SetCount方法執(zhí)行,并且參數(shù)Avalue被指定為1;當(dāng)執(zhí)行 I := MyComponent1.Count;方法時(shí),會(huì)將 Fcount的值返回給I。
屬性的聲明語(yǔ)法允許屬性聲明的Read和Write部分用訪問(wèn)方法取代對(duì)象私有數(shù)據(jù)域。屬性的讀方法是不帶參數(shù)的函數(shù),返回同屬性相同類(lèi)型的值。通常讀方法以Get開(kāi)頭。屬性的寫(xiě)方法總是帶一個(gè)參數(shù)的過(guò)程。寫(xiě)方法常常以Set開(kāi)頭。
思考題:
1、? 如何為控件添加屬性?
2、? 從TwinControl類(lèi)派生的控件的特點(diǎn)是什么?