`
javatoyou
  • 浏览: 1016572 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

通过实例看VCL组件开发全过程(三)

 
阅读更多

三、添加组件图标、注册组件的属性类别:

在前面的文章中我们已经完成了组件的基本功能的开发。但是遗憾的是一但你安装了组件包,你会发现组件显示在delphi组件页中的图标并不能清楚的说明我们组件的功能(由于我们的组件继承自TcustomLabel,图标是一个默认的delphiVCL的图标,如果组件继承自其它已经出现在组件面板中的组件,图标还会和已有组件一样!)。显然一个好的组件特别是一个要发布的商业化组件需要一个有自己特色的目标,下面我们便来完成这一工作:

打开delphi自带的Image EditorToolsà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的一些单元并没有被安装,包括我们这里指出的这两个单元和将要在后文中指出的单元,这些单元属于delphiopen tools api是用来方便我们,特别是组件开发者用来扩展delphi。如果你的delphi没有这些单元,请将delphi安装目录下的source文件夹里ToolsAPI文件夹中的pas文件拷贝到lib目录下,在你第一个需要用到这些单元的程序编译时delphi会自动编译这些单元)方法注册属性类别。我们把以下的部分代码补充进我们开发的组件的原代码中:

uses

DesignIntf;//delphi7//delphi5DsgnIntf

///////////这部分代码如果是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就可以看到属性已经被清楚的分类了,如下图:

<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600" id="_x0000_t75"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape type="#_x0000_t75" style="width: 143.25pt; height: 210.75pt;" id="_x0000_i1025"><img o:title="OI" src="http://www.evget.com/zh-CN/article/articlePic/Dev_Image_2003-8-51744490%5B1%5D.jpg" alt=""></shape>

然而,应该清楚的是属性类别绝对不能被滥用,因为过多的使用该技术会使组件使用者为了找到某一个属性变的更加麻烦和摸不着头脑。

在接下来的文章里,我们将继续研究两个很有用的组件特性。

分享到:
评论

相关推荐

    delphi开发技术大全

    全书共分36章,包括认识Delphi,Delphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、...

    《Delphi 深度编程及其项目应用开发》PDF书及代码

    《Delphi 深度编程及其项目应用开发》 作 者: 李存斌 汪兵 编著 丛书名: 万水软件项目应用与实例开发丛书 出版社: 中国水利水电出版社 出 版: 2002-9----------简 介 本书是在总结作者多年Delphi开发经验的基础上...

    Delphi7-程序设计与开发技术大全.pdf

    第16 章:大体讲解使用Delphi 开发VCL 组件的方法。 第17 章:主要讲解Delphi 数据库开发工具基础知识,只有熟练掌握这些工具的使 用方法,才可以以更高的效率开发数据库应用程序。 第18 章:主要讲解客户/服务器...

    零点起航Delphi7基础教程源码

    Delphi7是Inprise公司推出的面向对象的可视化编程语言,它提供了大量VCL组件,具有强大的数据库开发和网络编程能力,极大地提高了应用系统的开发速度,是目前最优秀的前端开发平台之一。 本书从基础入手,由浅入深...

    114_《Delphi开发技术大全》(2/3)

    全书共分36章,包括认识Delphi,Delphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、...

    114_《Delphi开发技术大全》(1/3)

    全书共分36章,包括认识Delphi,Delphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、...

    114_《Delphi开发技术大全》(3/3)

    全书共分36章,包括认识Delphi,Delphi语言基础,Delphi控制语句,数组与算法,过程与函数,面向对象的程序设计,用户界面设计,菜单、工具栏和状态栏设计,对话框在程序中的应用,组件的使用,自制VCL组件,鼠标、...

    Delphi5开发人员指南

    6.6.2 组件实例的命名规则 140 6.7 代码标准文档升级 141 第7章 使用ActiveX控件 142 7.1 什么是ActiveX控件 142 7.2 何时使用ActiveX控件 142 7.3 把ActiveX控件加到组件面板上 143 7.4 Delphi组件外套 144 7.4.1 ...

    delphi精要 pdf

    本书也是一本参考手册,包括了“IDE的快捷键列表(2.8)、“编译指令”(3.4)、“VCL消息大全(5.2.4)、“常用函数和过程”(第8章)以及一些常用的、重要的开发技巧(第9章)等内容。本书同时也较为全面地讲述了...

    D5开发人员指南-03卷

    13.3.5 全汇编过程 403 13.3.6 记录 403 13.4 使用挂钩 404 13.4.1 设置挂钩 404 13.4.2 使用挂钩函数 405 13.4.3 使用脱钩函数 405 13.4.4 使用SendKeys:一个JournalPlay- back类型的挂钩 405 13.5 使用C/C++的...

    易语言程序免安装版下载

    修改BUG:VCL相关支持库部分组件在修改个别属性或调用个别方法后不可见,并改进了Delphi版本的支持库SDK。 15. 修改BUG:高级表格在列类型为数值型时,添加新行且省略标题的情况下,会导致程序异常。 16. 修改BUG...

Global site tag (gtag.js) - Google Analytics