(接上文)
三、添加組件圖標(biāo)、注冊組件的屬性類別:
在前面的文章中我們已經(jīng)完成了組件的基本功能的開發(fā)。但是遺憾的是一但你安裝了組件包,你會發(fā)現(xiàn)組件顯示在delphi組件頁中的圖標(biāo)并不能清楚的說明我們組件的功能(由于我們的組件繼承自TcustomLabel,圖標(biāo)是一個默認的delphiVCL的圖標(biāo),如果組件繼承自其它已經(jīng)出現(xiàn)在組件面板中的組件,圖標(biāo)還會和已有組件一樣!)。顯然一個好的組件特別是一個要發(fā)布的商業(yè)化組件需要一個有自己特色的目標(biāo),下面我們便來完成這一工作:
打開delphi自帶的Image Editor(ToolsàImage Editor),新建一個組件資源(fileànewàComponent Resource File (.dcr)),在彈出的窗口中右鍵單擊new新建一個bitmap位圖資源調(diào)整好位圖的大小(我們用24*24)和色深后確定,雙擊建立好的位圖名字還是做圖(做圖工具的使用基本和windows自帶的畫圖程序差不多,這里略過),完成后我們需要為位圖文件另取一個名字(右鍵點擊bitmap),因為delphi強制要求這個位圖的名字要和組件的名字一樣,并且要全部大寫,這里我們就取為:TCLOCK。最后保存這個資源文件到我們的組件包(dpk文件)目錄,命名為ClockDcr.dcr。最后在Clock的代碼中的interface部分加入一個編譯器開關(guān):{$R ClockDcr.dcr}然后重新編譯更新組件(還記得怎么更新嗎?),這時的組件圖標(biāo)已經(jīng)變成我們剛才做的位圖了!
接下來我們將為我們開發(fā)的組件的屬性進行分類并介紹一個組件開發(fā)中重要的特性:屬性類別。
為了讓我們組件的一些和時鐘有關(guān)的屬性注冊成一個新的類別把它們和label的屬性分開開來,讓組件用戶能夠更容易的發(fā)現(xiàn)組件的新特性,我們繼承了屬性類別的基類TpropertyCategory(在delphi5中這需要引用單元DsgnIntf,不過應(yīng)該特別注意在delphi7中已經(jīng)沒有了這個基類,也沒有這個單元文件,注冊新的屬性類別可以通過直接使用RegisterPropertyInCategory這種簡單的辦法完成,在下面的代碼中會在相應(yīng)的地方同時給出兩種方法并說明他們的不同。)并覆蓋它的兩個類方法,最后在Register過程中用RegisterPropertyInCategory(在delphi5中在DsgnIntf單元,在delphi7中在DesignIntf單元,注意:delphi的一些單元并沒有被安裝,包括我們這里指出的這兩個單元和將要在后文中指出的單元,這些單元屬于delphi的open tools api是用來方便我們,特別是組件開發(fā)者用來擴展delphi。如果你的delphi沒有這些單元,請將delphi安裝目錄下的source文件夾里ToolsAPI文件夾中的pas文件拷貝到lib目錄下,在你第一個需要用到這些單元的程序編譯時delphi會自動編譯這些單元)方法注冊屬性類別。我們把以下的部分代碼補充進我們開發(fā)的組件的原代碼中:
uses
DesignIntf;//delphi7//delphi5用DsgnIntf
///////////這部分代碼如果是delphi7就不需要了///////////////
type
TClockGategory=class(TpropertyCategory)//建立一個新的屬性類別
Class function Name:string;override;//屬性類別的名稱
Class function Description:string;override;//屬性類別的描述
End;
……
Class function TClockGategory .Name:string;
Begin
Result:=’ClockPro’;
End;
Class function TClockGategory . Description:string;
Begin
Result:=’Our Component Clock Description’;
End;
////////////////////////////////////////////////////////////////////////////////////
接下來我們要做的就是修改register過程:
procedure Register;
begin
RegisterComponents('ClockAndTime', [TClock]);
////////////這是delphi7的代碼/////////////////////////////
RegisterPropertyInCategory('ClockPro',TClock,'State');
RegisterPropertyInCategory('ClockPro',TClock,'Active');
RegisterPropertyInCategory('ClockPro',TClock,'BeginTime');
RegisterPropertyInCategory('ClockPro',TClock,'WakeTime');
RegisterPropertyInCategory('ClockPro',TClock,'AllowWake');
RegisterPropertyInCategory('ClockPro',TClock,'OnWakeUp');
RegisterPropertyInCategory('ClockPro',TClock,'OnTimeUp');
//////////////////////////////////////////////////////////
///////////////這是delphi5的代碼/////////////////////////
{
RegisterPropertyInCategory(TClockGategory,TClock,'State');
RegisterPropertyInCategory(TClockGategory,TClock,'Active');
RegisterPropertyInCategory(TClockGategory,TClock,'BeginTime');
RegisterPropertyInCategory(TClockGategory,TClock,'WakeTime');
RegisterPropertyInCategory(TClockGategory,TClock,'AllowWake');
RegisterPropertyInCategory(TClockGategory,TClock,'OnWakeUp');
RegisterPropertyInCategory(TClockGategory,TClock,'OnTimeUp');
}
////////////////////////////////////////////////////////
end;
重新編譯后,做一個測試程序,這時只要組件使用者右鍵單擊Object Inspector選擇ArrangeàBy Category就可以看到屬性已經(jīng)被清楚的分類了,
然而,應(yīng)該清楚的是屬性類別絕對不能被濫用,因為過多的使用該技術(shù)會使組件使用者為了找到某一個屬性變的更加麻煩和摸不著頭腦。
在接下來的文章里,我們將繼續(xù)研究兩個很有用的組件特性。
(未完待續(xù))
|