1 / 26

第二十三章 元件的製作

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

tillie
Download Presentation

第二十三章 元件的製作

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Delphi所提供的元件,背後都存在著相對應的類別程式,本書已在第九章介紹類別的製作。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 的實作 procedure Register; begin RegisterComponents('Samples', [TPass]); //Samples 元件欲放置的標籤名稱 //TPass 類別名稱 end;

  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.

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

More Related