26
第第第第第 第第第第第 23-1 第第第第第第 23-2 第第第第第第 23-3 第第第第第

第二十三章 元件的製作

  • Upload
    tillie

  • View
    35

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 第二十三章  元件的製作

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

Page 2: 第二十三章  元件的製作

Delphi 所提供的元件,背後都存在著相對應的類別程式,本書已在第九章介紹類別的製作。本章則要逐步引領讀者完成類別的元件化,並安裝在元件盤上供人點選。

本章將以三種方式循序漸進的介紹元件製作,分別是 23-1 節類別轉為元件, 23-2 節的改良單一元件的元件及 23-3 節的改良多個元件的元件。研習本章之前,請讀者先複習第九章的類別與物件,第八章結構型態的動態物件製作方式及第十四章的專案。

Page 3: 第二十三章  元件的製作

23-1 類別轉為元件 於範例 9-2c 中,我們已完成 TPass 類別

的製作,本節則要介紹將此類別轉為元件,並安裝在元件盤上。以下將以四個步驟完成類別的元件化,分別是程式的修改、元件的測試、製作元件圖項以及安裝新元件。

Page 4: 第二十三章  元件的製作

程式的修改本例將 9-2c 的類別程式修改如下

unit Pass;Interfaceuses Windows, Messages, SysUtils, Classes, Controls, StdCtrls; // 單元 Pass 要獨立存在,請新增此 usestype TPass = class (TComponent) //TPass 類別名稱 // 非可見元件應繼承自 TComponent private Fa:integer; Fb:String; public procedure dispose(); procedure setData(value:integer); function getData():integer;

Page 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;// 新增 Registerprocedure Register;Implementation// 新增 Register 的實作procedure Register;begin RegisterComponents('Samples', [TPass]); //Samples 元件欲放置的標籤名稱 //TPass 類別名稱end;

Page 6: 第二十三章  元件的製作

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

Page 7: 第二十三章  元件的製作

TComponent 範例 9-2c 的類別 Tpass 是繼承自類別的

始祖 TObject ,但依照 Delphi 的規定,若要將類別轉為元件,則此類別應繼承自 TComponent 。

Page 8: 第二十三章  元件的製作

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

試結果。

Page 9: 第二十三章  元件的製作

製作元件圖項 元件盤上的每一元件都有各自的圖項,

自製元件亦不例外。 Delphi 所付的 Image Edit 正是製作元件圖項的工具,此圖項的檔名應同類別名稱,副檔名是 *.dcr ,若未製作元件資源檔則系統將會以預設的圖項顯示。

以下範例示範本例所需的 Pass.dcr 。

Page 10: 第二十三章  元件的製作

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

Page 11: 第二十三章  元件的製作

安裝新元件 當您已完成類別程式的撰寫、測試及圖

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

Page 12: 第二十三章  元件的製作

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

Page 13: 第二十三章  元件的製作

使用新元件 自訂元件的使用與內建元件相同,請看

以下範例說明。

Page 14: 第二十三章  元件的製作

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

Page 15: 第二十三章  元件的製作

元件的移除 剛剛我們安裝元件時,是把元件安裝至

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

Page 16: 第二十三章  元件的製作

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

Page 17: 第二十三章  元件的製作

23-2 繼承可視元件 上一節我們直接繼承 TComponent ,所

以執行時就與 TTimer 類別一樣,元件並沒有顯示在表單。本節將延續 TPass的功能,但直接繼承 TEdit 類別,使得此元件有輸入資料的功能。

以下範例示範如何使用元件設計師來新增我們所要的元件。

Page 18: 第二十三章  元件的製作

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

Page 19: 第二十三章  元件的製作

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

Page 20: 第二十三章  元件的製作

23-3 複合式元件 上一節的 TPassEdit 已擁有輸入資料及判斷

資料的能力,但是我們並不滿足,因為使用者使用此元件時,還要自己配置輸出的 Label 元件及執行的 Button 元件,本節即要介紹如何同時擁有 Edit 、 Label 及 Button 元件的新元件。

要達成此功能,是不是可以同時繼承以上三個類別呢?答案是不可以的,因為 Delphi 並不允許多重繼承,那要怎麼辦呢?答案當然是繼承適當的類別,然後以動態物件的方式產生以上三個元件,並連結各別元件的屬性、事件,作為新元件的屬性與事件,最後再新增自已的方法。

Page 21: 第二十三章  元件的製作

選擇父類別 VCL 中常用的基礎類別有 TObject 、 TPersistent 、 TCompon

ent 、 TControl 、 TWinControl 及 TGraphicControl ,其繼承關係已圖示於 23-1 節,以上每一類別都有其基本的屬性、方法及事件,分別說明如下。當您要開發一個新類別時,即要選擇適當的類別,才能縮短類別的建構時間,而不是一切從 TObject開始建構。

TObject直接從 TObject 繼承的類別無法成為 VCL元件,但它卻是自行開發類別時所不可或缺的基礎類別,本書第九章的自訂類別則都繼承 TObject 。

TPersistentTpersistent 類別已擁有從資料流中取出或寫入屬性的能力。

TComponentTComponent 的衍生類別才可以成為 VCL元件並安裝在元件盤上。本書範例 23-1a 的 Tpass即繼承自 TComponent 。

Page 22: 第二十三章  元件的製作

TControlTControl 類別已擁有 Top 、 Left 、 Width 、 Height 、Visible 、 Enabled 、 Color 、 Font 、 Text 、 Caption 等屬性及 OnClick、 OnMouseDown 等鍵盤與滑鼠事件。

TWinControlTWinControl 除了具備以上 TControl 所擁有的能力外,已經具有 Window Handle ,可以得到鍵盤輸入焦點以及可以成為其他物件的父元件,此類別最具代表性的元件為 Edit 及 Form 等元件。

TGraphControlTGraphControl 元件與 TWinControl 元件最大的不同是,它們不具有 Window Handle ,不能獲得到鍵盤輸入焦點,也不能成為其他物件的父元件 ,此類別最具代表性的元件為 Label 、 Image 等元件 。

Page 23: 第二十三章  元件的製作

範例 23-3a 示範建構複合元件 本例欲建立一個包含 Edit 、 Label 及 B

utton 的元件,其功能為由 Edit 的 Text 屬性輸入分數, Label 的 Caption 屬性輸出分數的及格與否及 Button 元件的OnClick 事件作為觸發執行的依據。

Page 24: 第二十三章  元件的製作

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

Page 25: 第二十三章  元件的製作

習題 請將本書的範例 4-4a ,作成一個求解一

元二次方程式的元件,應含“求解”與“結束”兩個按鈕。

Page 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 型態,請特別留意資料型態的一致。