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.