3、添加组件图标、注册组件属性类别:
在前面文章中我们已经完成了组件基本功能开发但是遗憾是但你安装了组件包你会发现组件显示在delphi组件页中图标并不能清楚介绍说明我们组件功能(由于我们组件继承自TcustomLabel图标是个默认delphiVCL图标如果组件继承自其它已经出现在组件面板中组件图标还会和已有组件样!)显然个好组件特别是个要发布商业化组件需要个有自己特色目标下面我们便来完成这工作:
打开delphi自带Image Editor(ToolsàImage Editor)新建个组件资源(fileààComponent Resource File (.dcr))在弹出窗口中右键单击新建个bitmap位图资源调整好位图大小(我们用24*24)和色深后确定双击建立好位图名字还是做图(做图工具使用基本和windows自带画图差不多这里略过)完成后我们需要为位图文件另取个名字(右键点击bitmap)delphi强制要求这个位图名字要和组件名字样并且要全部大写这里我们就取为:TCLOCK最后保存这个资源文件到我们组件包(dpk文件)目录命名为ClockDcr.dcr最后在Clock代码中erface部分加入个编译器开关:{$R ClockDcr.dcr}然后重新编译更新组件(还记得如何更新吗?)这时组件图标已经变成我们刚才做位图了!
接下来我们将为我们开发组件属性进行分类并介绍个组件开发中重要特性:属性类别
为了让我们组件些和时钟有关属性注册成个新类别把它们和label属性分开开来让组件用户能够更容易发现组件新特性我们继承了属性类别基类TpropertyCategory(在delphi5中这需要引用单元DsgnIntf不过应该特别注意在delphi7中已经没有了这个基类也没有这个单元文件注册新属性类别可以通过直接使用RegisterPropertyInCategory这种简单办法完成在下面代码中会在相应地方同时给出两种思路方法并介绍说明他们区别)并覆盖它两个类思路方法最后在Register过程中用RegisterPropertyInCategory(在delphi5中在DsgnIntf单元在delphi7中在DesignIntf单元注意:delphi些单元并没有被安装包括我们这里指出这两个单元和将要在后文中指出单元这些单元属于delphiopen tools api是用来方便我们特别是组件开发者用来扩展delphi如果你delphi没有这些单元请将delphi安装目录下source文件夹里ToolsAPI文件夹中pas文件拷贝到lib目录下在你第个需要用到这些单元编译时delphi会自动编译这些单元)思路方法注册属性类别我们把以下部分代码补充进我们开发组件原代码中:
uses
DesignIntf;//delphi7//delphi5用DsgnIntf
///////////这部分代码如果是delphi7就不需要了///////////////
type
TClockGategory=(TpropertyCategory)//建立个新属性类别
Class function Name:;override;//属性类别名称
Class function Description:;override;//属性类别描述
End;
……
Class function TClockGategory .Name:;
Begin
Result:=’ClockPro’;
End;
Class function TClockGategory . Description:;
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就可以看到属性已经被清楚分类了
然而应该清楚是属性类别绝对不能被滥用过多使用该技术会使组件使用者为了找到某个属性变更加麻烦和摸不着头脑
在接下来文章里我们将继续研究两个很有用组件特性
(未完待续)
最新评论