(接上文)
三、添加組件圖標、注冊組件的屬性類別:
在前面的文章中我們已經完成了組件的基本功能的開發。但是遺憾的是一但你安裝了組件包,你會發現組件顯示在delphi組件頁中的圖標並不能清楚的說明我們組件的功能(由於我們的組件繼承自TcustomLabel,圖標是一個默認的delphiVCL的圖標,如果組件繼承自其它已經出現在組件面板中的組件,圖標還會和已有組件一樣!)。顯然一個好的組件特別是一個要發布的商業化組件需要一個有自己特色的目標,下面我們便來完成這一工作:
打開delphi自帶的Image Editor(ToolsàImage Editor),新建一個組件資源(fileànewàComponent Resource File (.dcr)),在彈出的窗口中右鍵單擊new新建一個bitmap位圖資源調整好位圖的大小(我們用24*24)和色深後確定,雙擊建立好的位圖名字還是做圖(做圖工具的使用基本和windows自帶的畫圖程序差不多,這裡略過),完成後我們需要為位圖文件另取一個名字(右鍵點擊bitmap),因為delphi強制要求這個位圖的名字要和組件的名字一樣,並且要全部大寫,這裡我們就取為:TCLOCK。最後保存這個資源文件到我們的組件包(dpk文件)目錄,命名為ClockDcr.dcr。最後在Clock的代碼中的interface部分加入一個編譯器開關:{$R ClockDcr.dcr}然後重新編譯更新組件(還記得怎麼更新嗎?),這時的組件圖標已經變成我們剛才做的位圖了!
接下來我們將為我們開發的組件的屬性進行分類並介紹一個組件開發中重要的特性:屬性類別。
為了讓我們組件的一些和時鐘有關的屬性注冊成一個新的類別把它們和label的屬性分開開來,讓組件用戶能夠更容易的發現組件的新特性,我們繼承了屬性類別的基類TpropertyCategory(在delphi5中這需要引用單元DsgnIntf,不過應該特別注意在delphi7中已經沒有了這個基類,也沒有這個單元文件,注冊新的屬性類別可以通過直接使用RegisterPropertyInCategory這種簡單的辦法完成,在下面的代碼中會在相應的地方同時給出兩種方法並說明他們的不同。)並覆蓋它的兩個類方法,最後在Register過程中用RegisterPropertyInCategory(在delphi5中在DsgnIntf單元,在delphi7中在DesignIntf單元,注意:delphi的一些單元並沒有被安裝,包括我們這裡指出的這兩個單元和將要在後文中指出的單元,這些單元屬於delphi的open tools api是用來方便我們,特別是組件開發者用來擴展delphi。如果你的delphi沒有這些單元,請將delphi安裝目錄下的source文件夾裡ToolsAPI文件夾中的pas文件拷貝到lib目錄下,在你第一個需要用到這些單元的程序編譯時delphi會自動編譯這些單元)方法注冊屬性類別。我們把以下的部分代碼補充進我們開發的組件的原代碼中:
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就可以看到屬性已經被清楚的分類了,
然而,應該清楚的是屬性類別絕對不能被濫用,因為過多的使用該技術會使組件使用者為了找到某一個屬性變的更加麻煩和摸不著頭腦。
在接下來的文章裡,我們將繼續研究兩個很有用的組件特性。
(未完待續)