Presentation is loading. Please wait.

Presentation is loading. Please wait.

第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件.

Similar presentations


Presentation on theme: "第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件."— Presentation transcript:

1 第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件

2 Delphi所提供的元件,背後都存在著相對應的類別程式,本書已在第九章介紹類別的製作。
本章則要逐步引領讀者完成類別的元件化,並安裝在元件盤上供人點選。 本章將以三種方式循序漸進的介紹元件製作,分別是23-1節類別轉為元件,23-2節的改良單一元件的元件及23-3節的改良多個元件的元件。研習本章之前,請讀者先複習第九章的類別與物件,第八章結構型態的動態物件製作方式及第十四章的專案。

3 23-1 類別轉為元件 於範例9-2c中,我們已完成TPass類別的製作,本節則要介紹將此類別轉為元件,並安裝在元件盤上。以下將以四個步驟完成類別的元件化,分別是程式的修改、元件的測試、製作元件圖項以及安裝新元件。

4 程式的修改 本例將9-2c的類別程式修改如下 unit Pass; Interface uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls; //單元 Pass 要獨立存在,請新增此 uses type TPass = class (TComponent) //TPass 類別名稱 //非可見元件應繼承自 TComponent private Fa:integer; Fb:String; public procedure dispose(); procedure setData(value:integer); function getData():integer;

5 procedure setResult(value :String);
function getResult() :String; published //bublished 的封裝等級與 public 相同 //,但屬性值可出現物件檢視視窗 property Data :integer read getData write setData ; property Result:String read getResult write setResult; end; //新增 Register procedure Register; Implementation //新增 Register 的實作 begin RegisterComponents('Samples', [TPass]); //Samples 元件欲放置的標籤名稱 //TPass 類別名稱

6 procedure TPass.dispose();
begin Fb:='不及格'; if (Fa>=60) then Fb:='及格'; end; procedure TPass.setData(value:integer); if Fa <> value then Fa:= value; function Tpass.getData() :integer; Result:=Fa; end ; procedure TPass.setResult(value:String); if Fb<> value then Fb:= value; function TPass.getResult():String; Result:=Fb; end.

7 TComponent 範例9-2c的類別Tpass是繼承自類別的始祖TObject,但依照Delphi的規定,若要將類別轉為元件,則此類別應繼承自TComponent。

8 範例 23-1a 根據以上說明,修改TPass類別,並測試結果。

9 製作元件圖項 元件盤上的每一元件都有各自的圖項,自製元件亦不例外。Delphi所付的Image Edit正是製作元件圖項的工具,此圖項的檔名應同類別名稱,副檔名是*.dcr,若未製作元件資源檔則系統將會以預設的圖項顯示。 以下範例示範本例所需的Pass.dcr。

10 範例 23-1b 示範元件圖項的製作。

11 安裝新元件 當您已完成類別程式的撰寫、測試及圖項的製作,緊接的工作就是進行元件的安裝,使得往後得以在元件盤上直接使用點選的方式,樣例您已完成的類別。以下範例將介紹元件的安裝步驟。

12 範例 23-1c 示範元件的安裝。

13 使用新元件 自訂元件的使用與內建元件相同,請看以下範例說明。

14 範例 23-1d 示範自訂元件的使用。

15 元件的移除 剛剛我們安裝元件時,是把元件安裝至C:\Program Files\Borland\Delphi7\Lib\dclusr.dpk 套件,所以若要移除所安裝的元件,亦是開啟以上套件,並移除相關的檔案與單元,請看以下範例說明 。

16 範例 23-1e 示範如何移除Pass元件。

17 23-2 繼承可視元件 上一節我們直接繼承TComponent,所以執行時就與TTimer類別一樣,元件並沒有顯示在表單。本節將延續 TPass的功能,但直接繼承TEdit類別,使得此元件有輸入資料的功能。 以下範例示範如何使用元件設計師來新增我們所要的元件。

18 範例 23-2a 如何以元件設計師新增一個可輸入分數,且可判斷是否及格的元件。

19 範例 23-2b 示範TPassEdit元件的使用。

20 23-3 複合式元件 上一節的TPassEdit已擁有輸入資料及判斷資料的能力,但是我們並不滿足,因為使用者使用此元件時,還要自己配置輸出的Label 元件及執行的Button元件,本節即要介紹如何同時擁有Edit 、 Label 及Button元件的新元件。 要達成此功能,是不是可以同時繼承以上三個類別呢?答案是不可以的,因為Delphi並不允許多重繼承,那要怎麼辦呢?答案當然是繼承適當的類別,然後以動態物件的方式產生以上三個元件,並連結各別元件的屬性、事件,作為新元件的屬性與事件,最後再新增自已的方法。

21 選擇父類別 VCL 中常用的基礎類別有 TObject、TPersistent、TComponent、TControl 、TWinControl及 TGraphicControl,其繼承關係已圖示於23-1節,以上每一類別都有其基本的屬性、方法及事件,分別說明如下。當您要開發一個新類別時,即要選擇適當的類別,才能縮短類別的建構時間,而不是一切從 TObject開始建構。 TObject 直接從TObject繼承的類別無法成為VCL元件,但它卻是自行開發類別時所不可或缺的基礎類別,本書第九章的自訂類別則都繼承TObject。 TPersistent Tpersistent類別已擁有從資料流中取出或寫入屬性的能力。 TComponent TComponent 的衍生類別才可以成為VCL元件並安裝在元件盤上。本書範例 23-1a的Tpass即繼承自TComponent。

22 TControl TControl類別已擁有Top、Left、Width、Height、Visible、Enabled、Color、Font、 Text、Caption等屬性及OnClick、 OnMouseDown 等鍵盤與滑鼠事件。 TWinControl TWinControl除了具備以上TControl所擁有的能力外,已經具有Window Handle,可以得到鍵盤輸入焦點以及可以成為其他物件的父元件,此類別最具代表性的元件為Edit 及Form等元件。 TGraphControl TGraphControl元件與TWinControl元件最大的不同是,它們不具有Window Handle,不能獲得到鍵盤輸入焦點,也不能成為其他物件的父元件 ,此類別最具代表性的元件為Label、Image等元件 。

23 範例 23-3a 示範建構複合元件 本例欲建立一個包含Edit、Label及Button 的元件,其功能為由Edit 的Text屬性輸入分數,Label的Caption屬性輸出分數的及格與否及Button元件的OnClick事件作為觸發執行的依據。

24 範例 23-3b 示範使用自建的PassEditLabel元件。

25 習題 請將本書的範例4-4a,作成一個求解一元二次方程式的元件,應含“求解”與“結束”兩個按鈕。

26 範例4-4a 請設計一個程式, 可以解一元二次方程式
1. 使用edia、edib及edic分別輸入方程式的三個係數a、 b及c。 2. 使用lblOut輸出結果。 程式說明: 1. Delphi並無次方與根號運算子,若欲使用次方或根號運算,則應使用intpower、power或sgrt等數學函式,且應於uses連結檔宣告區中,引用數學函式如下: uses Math; 2. intpower、power或sgrt等數學函式,計算結果均傳回實數的Extended型態,請特別留意資料型態的一致。


Download ppt "第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件."

Similar presentations


Ads by Google