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