作者:Danny Tzu
日期:May-2-2002
其實這篇文章很早以前就想寫了, 但礙於個人能力及時間的問題, 就一直拖著沒動作, 本篇並不是要講很多 VCL 的大道理, 而是教您如何簡單的 Step By Step 作出您自己的元件.
當然有人從不用3-Party元件, 理由是可以直接在另一台電腦上撰寫程式不用安裝元件, 但是Delphi本身就是用元件堆出來的, 不使用自訂元件我認為並不是一個聰明的作法.
撰寫本篇是因為大多數使用 Delphi 的人只會使用元件, 也許這是當初採用 Delphi 的原因, 但是在設計軟體時, 有很多時候只要簡單的設計或修改元件就可以解決問題, 我知道也有人寫一些共用的 procedure 或 function 但使用起來會有些限制或不方便, 但一想到要寫(改)元件要知道很多技術及原理, 尤其完整的撰寫元件文章書籍都是片片斷斷, 可能就馬上打了退堂鼓, 其實寫元件也可以很簡單, 當然您懂的東西越多可以寫的元件功能及型態越多.
本篇不談 Interface 的使用(以下範例一個 Interface 都沒用到), 但並不表示 Interface 不重要, 相反的它非常重要, 主要是我認為這不適合在這理說明, 如果各位有興趣的話可以參考 BrianChang 的「Interface的基礎 」及 code6421 的「淺談Interface」兩篇文章.
這裡我不會講很多的大道理, 但這並不表示您就可以不需要瞭解一些像: 物件導向, Windows 訊息機制, Stream I/O 機制 ... 等相關知識, 如果您懂得越多當然寫出來的元件越好; 雖然 Delphi 以視覺化設計著稱, 但寫元件一點也不視覺化, 您必須要像在 DOS 時代一樣純手工打造, 也許對有點年紀的人來說會反而更熟悉吧 !
使用環境Delphi 5, 6 All Version
建議使用 Enterprise 版本可以有很多 VCL Source code 可以參考.
元件大致上分為二大類:
不可視元件:其實您已經在寫元件了可能您自己都不知道, 您每天寫程式都是寫在哪裡 ? TForm 對吧 ! 您的 Form 都是繼承自 TForm 這個元件, New Form Unit 會產生如下的框架程式碼:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end.
而以 New Component (Component -> New Component) Unit 所產生的框架大概像下面這樣:
unit CustomControl1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TCustomControl1 = class(TCustomControl) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples', [TCustomControl1]); end; end.
注意到了嗎? 這二個 Unit 只差在 TForm 沒有宣告 protected, published 這二個節區, 因為大部份在寫 Form 時都用不到這二個節區, 所以 Delphi 會省略掉, 但是您要用的話也可以, 就自己手動加上吧!
另外因為要安裝到元件盤的關係, 所以 CustomControl1 會多出 procedure Register, 但反過來想 TForm 是不能安裝到元件盤的, 這部份您可以試試看有沒有辦法安裝到元件盤, 可以的話請告訴我一聲.
另外 TForm 不用安裝就能使用, 這點我想是為了方便的原因, 不過如果您是用 Delphi Package 技術的話還是需要安裝這一個步驟, 這就和元件一樣了, 如果您有興趣可以參考在下另一拙作 "Delphi Package 無痛使用"
首先我們作一個 "不可視元件" , 為何要先選 "不可視元件" 作呢 ? 原因是 "簡單" 因為不需要很多的技術就能作了.
開始當然要先選繼承的父親是誰 ? 因為我們是作不可視元件所以選 TComponent 為父親, 另外順便一提 Delphi 有定義繼承自 TComponent (含)以下的叫 "元件" , 其他的叫 "物件", 因此 "物件" 包含 "元件" (白馬非馬也, 聽過吧 !), "元件" 和 "物件" 差在可不可以安裝在 "元件盤" 上(不過TForm是例外,雖然它也是繼承自TComponent).
首先要決定繼承自那一個元件, 因為我們要撰寫 "不可視元件",當然是 TComponent 了,如果您高興也可以繼承別的元件, 不過相信一定要額外處理比較多的事情, 我們就不找麻煩了.
在如下畫面中選擇 New Component 新增元件, 此步驟以後不在重覆提到.
在 Ancestor type 中選擇要繼承的父階元件, 我們選 TComponent, Class Name 內輸入我們要建立的元件名稱, 這裡順便一提, 元件的撰寫慣例是用 T 開頭, 後接 2-3Byte的元件組名(自定), 其後才是此元件的名稱(詳細定義請參考蔡煥麟的「請依照標準寫碼風格撰寫程式」、「 Delphi 5 寫碼標準」和「Delphi 5 元件型態字首」), 這麼做的原因是 Delphi 不允許 Class Name 重覆, 如果大家都亂編的話, 重覆的機率就很高了; 但我們只是示範如何寫元件就省略元件組名了.
但新增元件和 Class 有何關係, 我這樣說好了, 元件(物件)是類別(Class)的實作這樣說比較容易理解了吧!
本文地址:http://com.8s8s.com/it/it5589.htm