三添加组件图标注册组件的属性类别 在前面的文章中我们已经完成了组件的基本功能的开发但是遗憾的是一但你安装了组件包你会发现组件显示在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就可以看到属性已经被清楚的分类了如下图 然而应该清楚的是属性类别绝对不能被滥用因为过多的使用该技术会使组件使用者为了找到某一个属性变的更加麻烦和摸不着头脑 在接下来的文章里我们将继续研究两个很有用的组件特性 |