Delphi 元件設計初步(一)

本文是关于Delphi元件设计的初级教程,介绍了如何从零开始创建自定义元件,特别是不可视元件。作者强调了理解对象导向、Windows消息机制等基础知识的重要性,并通过实例展示了创建TAutoClose元件的过程,该元件可定时关闭所属的TForm。
摘要由CSDN通过智能技术生成

Delphi 元件設計初步(一)

作者: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 可以參考.

開始吧

元件大致上分為二大類:

  1. 不可視元件:
    不可視元件一般和系統有關, 他的特色是在 Run Time 時在軟體上是看不到他的, 但確實會提供服務, 像 TActionList, TMainMenu, TPopupMenu, TDataBase, TQuery.... 等. 
  2. 可視元件:
    可視元件和不可視元件剛好相反, 在 Run Time 時他是看得到的, 當然 Design Time 也是可以看到, 不然您如何設定特性(property)及 Event, 像 TImage, TDBGrid, TEdit .... 都是.

其實您已經在寫元件了可能您自己都不知道, 您每天寫程式都是寫在哪裡 ? 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 了,如果您高興也可以繼承別的元件, 不過相信一定要額外處理比較多的事情, 我們就不找麻煩了.

1. TAutoClose 定時關閉元件所在TForm:

在如下畫面中選擇 New Component 新增元件, 此步驟以後不在重覆提到.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值