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