Delphi提供了豐富的VCL組件供編程人員使用,同時還允許編程人員根據實際需要進行自定義組件的編寫。
組件的代碼編寫和我們平常寫的類很相似,但也有幾點不同,一個是需要從TComponent類繼承而來,另一個是要使用Published關鍵字定義我們想要出現在對象觀察器中的屬性是事件,再一個就是我們要把這些代碼添加到一個設計包中,之後通過對這個包進行編譯和安裝來發布我們編寫的組件。
組件中事件的定義和屬性定義一樣,使用Property關鍵字,事件的類型可以使用Delphi標准的事件類型如TNofifyEvent,或者是自已定義一個事件類型,其定義方式如下:
Type
TComponentEvent = procedure(Params) of object;
其中Params是根據組件需要定義的一個或多個參數,可以是任何類型的。
下面我們就以具體的實例來講解如何在Delphi中編寫自定義組件。首先在Delphi中新建一個包,然後在包中添加一個單元文件,在單元文件中定義如下組件類
Type
TMyComponentEvent = procedure (Sender: TObject) of object;
TMyComponent = class(TComponent)
private
FMyProperty: String;
FMyEvent: TMyComponentEvent;
procedure SetMyProperty(const Value: String);
protected
....
public
constructor Create;
destructor Destroy; override;
...
published
//The following propety and event will appear in Object Inspector
property MyProperty: String read FMyProperty write SetMyProperty;
property MyEvent: TMyComponentEvent read FMyEvent write FMyEvent;
end;
實現部分的代碼就省略了,此處僅為說明組件的定義。到此就完成了一個組件的定義。接下來我們就需要將這個組件注冊到Delphi中,讓其他編程人員可以像使用Delphi標准組件一樣在組件面板上看到我們定義的組件,並將其拖放到設計窗體上。注冊組件我們需要寫一個注冊過程,Delphi規定這個過程名必須為Register,且沒有任何參數,在這個過程中我們只需要調用在Classes單元中定義好的RegisterComponents方法(此方法需要兩個參數,第一個是組件面板的名稱,第二個就是要注冊的組件類數組),就可以將我們寫的組定注冊到Delphi中並在組件面板中出現。
procedure Register;
begin
RegisterComponents(‘PageName’, [TMyComponent]);
end;
編譯並安裝包,之後就可以在組件面板上看到我們定義的組件圖標了。我們發現組件圖標使用的是Delphi默認的,不形象,也不個性,我們應該如何為這個組件指定一個個性的圖標呢?其實也不難,這裡就要用到了Delphi自帶的工具Image Editor。
我們打開Image Editor,點擊New->Component Resource File,創建一個組件資源文件。此時會出現一個窗體,僅有一個“Components”結點,我們右擊該節點,在彈出的上下文菜單中選擇“New->Bitmap”,此時“Components”結點下會出現一個Bitmap結點,這個結點下還有一個名為“Bitmap1”的結點,即我們新建的Bitmap對象,將“Bitmap1”結點名稱改為我們編寫的組件名稱,注意這裡要全部使用大寫。然後雙擊這個結點就可以編輯一個32×32的圖像了。編輯好之後保存這個資源文件,這裡又有一點要注意,就是這個資源文件需要和組件注冊方法(Register方法)所在的單元文件名相同。最後將這個資源文件加入到我們創建的包中,再重新編譯並安裝這個包。
完整的代碼如下:
unit MyComponentUnit;
interface
usesSysUtils, Classes;
Type
TMyComponentEvent = procedure (Sender: TObject) of object;
TMyComponent = class(TComponent)
private
FMyProperty: String;
FMyEvent: TMyComponentEvent;
procedure SetMyProperty(const Value: String);
protected
....
public
constructor Create;
destructor Destroy; override;
...
published
//The following propety and event will appear in Object Inspector
property MyProperty: String read FMyProperty write SetMyProperty;
property MyEvent: TMyComponentEvent read FMyEvent write FMyEvent;
end;
procedure Register;
implementation
...{ TMyComponent }
constructor TMyComponent.Create;
begin
inherited;
end;
destructor TMyComponent.Destroy;
begin
inherited;
end;
procedure TMyComponent.SetMyProperty(const Value: String);
begin
FMyProperty := Value;
end;
procedure Register;
begin
RegisterComponents(‘PageName’, [TMyComponent]);
end;
end.