程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 第十九章-Delphi自定義部件開發(一)(2)

第十九章-Delphi自定義部件開發(一)(2)

編輯:Delphi

2. 建立原始控制

標准控制是在運行時可見的。這些標准控制都從TWinControl,繼承來的,當你建立原始控制時,你使用TCustomControl作為起始點。標准控制的關鍵特征是它具有窗口句柄,句柄保存在屬性Handle中,這種控制:

● 能接受輸入焦點

● 能將句柄傳送給Windows API函數

如果控制不需要接受輸入焦點,你可把它做成圖形控制,這可能節省系統資源。

3. 建立圖形控制

圖形控制非常類似定制的控制,但它們沒有窗口句柄,因此不占有系統資源。對圖形控制最大的限制是它們不能接收輸入焦點。你需要從TGraphicControl繼承,它提供了作圖的Canvas和能處理WM_PAINT消息,你需要覆蓋Paint方法。

4. 繼承窗口控制

Windows中有一種稱之為窗口類的概念,類似於面向對象的對象和類的概念。窗口類是Windows中相同窗口或控制的不同實例之間共享的信息集合。當你用傳統的Windows編程方法創建一種新的控制,你要定義一個新的窗口類,並在Windows中注冊。你也能基於已有的窗口類創建新的窗口類。這就稱為從窗口類繼承。在傳統的Windows編程中,如果你想建立客戶化的控制,你就必須將其做在動態鏈接庫裡,就象標准Windows控制,並且提供一個訪問界面。使用Delphi,你能創建一個部件包裝在已有窗口類之上。如果你已有客戶化控制的庫,並想使其運行在你的Delphi應用中,那你就能創建一個使你能使用已有控制和獲得新的控制的部件。在庫單元StdCtrls中有許多這樣的例子。

5. 建立非可視化的部件

抽象對象類型TComponent是所有部件的基礎類型。從TComponent直接繼承所創建的部件就是非可視化部件。你編寫的大多數部件都是可視控制。TComponent定義了部件在FormDesigner中所需的基本的屬性和方法。因此,從TComponent繼承來的任何部件都具備設計能力。

非可視部件相當少,主要用它們作為非可視程序單元(如數據庫單元)和對話框的界面。

19.2.1.3 建立新部件的方法

建立新部件的方法有兩種:

● 手工建立部件

● 使用Component Expert

一旦完成建立後,就得到所需的最小功能單位的部件,並可以安裝在Component Palette上。安裝完後,你就能將新部件放置在窗體窗口,並可在設計階段和運行階段進行測試。你還能為部件增加新的特征、更新選擇板、重新測試。

1. 手工創建部件

顯然創建部件最容易的方法是使用Component Expert。然而,你也能通過手工來完成相同步驟。

手工創建部件需要下列三步:

● 創建新的庫單元

● 繼承一個部件對象

● 注冊部件

⑴ 創建新的庫單元

庫單元是Object Pascal代碼的獨立編譯單位。每一個窗體有自己的庫單元。大多數部件(在邏輯上是一組)也有自己的庫單元。

當你建立部件時,你可以為部件創建一個庫單元,也可將新的部件加在已有的庫單元中。

① 為部件創建庫單元,可選擇File/New... ,在New Items對話框中選擇Unit,Delphi將創建一個新文件,並在代碼編輯器中打開它

② 在已有庫單元中增加部件,只須選擇File/OPen為已有庫單元選擇源代碼。在該庫單元中只能包含部件代碼,如果該庫單元中有一個窗體,將產生錯誤

⑵ 繼承一個部件對象

每個部件都是TComponent的後代對象。也可從TControl、TGraphicControl等繼承。

為繼承一個部件對象,要將對象類型聲明加在庫單元的interface部分。

例如,建立一個最簡單的從TComponent直接繼承非可視的部件,將下列的類型定義加在部件單元的interface部分。

type

TNewComponent=class(TComponent)

……

end;

現在你能注冊TNewComponent。但是新部件與TComponent沒什麼不同,你只創建了自己部件的框架。

⑶ 注冊部件

注冊部件是為了告訴Delphi什麼部件被加入部件庫和加入Component Palette的哪一頁。

為了注冊一個部件:

① 在部件單元的interface部分增加一個Register過程。Register不帶任何參數,因此聲明很簡單:

procedure Register;

如果你在已有部件的庫單元中增加部件,因為已有Register 過程,因此不須要修改聲明。

② 在庫單位的implementation部件編寫Register過程為每一個你想注冊的部件調用過程RegisterComponents,過程RegisterComponents帶兩個參數:Component Palette的頁名和部件類型集。例如,注冊名為TNewComponent的部件,並將其置於Component Palette的Samples頁,在程序中使用下列過程:

procedure Register;

begin

RegisterComponents('Samples', [TNewComponent]);

end;

一旦注冊完畢,Delphi自動將部件圖標顯示在Component Palette上。

2. 使用Component Expert(部件專家)

你能使用Component Expert創建新部件。使用Component Expert簡化了創建新部件最初階段的工作,因為你只需描述三件事:

● 新部件的名字

● 祖先類型

● 新部件要加入的Component Palette頁名

Component Expert執行了手工方式的相同工作:

● 建立新的庫單元

● 繼承得到新部件對象

● 注冊部件

但Component Expert不能在已有單元中增加部件。

可選擇File/New... ,在New Items對話框中選擇Component,就打開Component Expert對話框。 

填完Component Expert對話框的每一個域後,選擇OK。Delphi建立包括新部件和Register過程的庫單元,並自動增加uses語句。

你應該立刻保存庫單元,並給予其有意義的名字。

19.2.1.4. 測試未安裝的部件

在將新部件安裝在Component Palette之前就能測試部件運行時的動作。這對於調試新部件特別有用,而且還能用同樣的技術測試任意部件,無論該部件是否出現在Component Palette上。

從本質上說,你通過模仿用戶將部件放置在窗體中的Delphi的動作來測試一個未安裝的部件。

可按下列步驟來測試未安裝的部件

1. 在窗體單元的uses語句中加入部件所在單元的名字

2. 在窗體中增加一個對象域來表示部件

這是自己增加部件和Delphi增加部件的方法的主要不同點。

你將對象域加在窗體類型聲明底部的public部分。Delphi則會將對象域加在底部聲明的上面。

你不能將域加在Delphi管理的窗體類型的聲明的上部。在這一部分聲明的對象域將相應在存儲在DFM文件中。增加不在窗體中存在的部件名將產生DFM文件無效的錯誤。

3. 附上窗體的OnCreate事件處理過程

4. 在窗體的OnCreate處理過程中構造該部件

當調用部件的構造過程時,必須傳遞Owner參數(由Owner負責析構該部件)一般說來總是將Self作為Owner的傳入參數。在OnCreate中,Self是指窗體。

5. 給Component的Parent屬性賦值

設置Parent屬性往往是構造部件後要做的第一件事時。Parent在形式上包含部件,一般來說Parent是窗體或者GoupBox、Panel。通常給Parent賦與Self,即窗體。在設置部件的其它屬性之前最好先給Parent賦值。

6. 按需要給部件的其它屬性賦值

假設你想測試名為TNewComponent類型的新部件,庫單元名為NewTest。窗體庫單元應該是這樣的;

unit Unitl;

interface

uses SysUtils, Windows, Messages, Classes, Grophics, Controls, Forms, Dialogs,

Newtest;

type

Tforml = class(TForm)

procedure FormCreate(Sender: TObject);

private

{ private申 明 }

public

{ public申 明 }

NewComponent: TNewComponent;

end;

var

Forml: TForml;

implementation

{$R *.DFM }

procedure TForml.FormCreate ( Sender: TObject ) ;

begin

NewComponent := TNewComponent.Create ( Self );

NewCompanent.Parent := Self;

NewCompanent.Left := 12;

end;

end.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved