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

原创 2003年08月08日 08:35:00

(接上文)

三、添加组件图标、注册组件的属性类别:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在前面的文章中我们已经完成了组件的基本功能的开发。但是遗憾的是一但你安装了组件包,你会发现组件显示在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就可以看到属性已经被清楚的分类了,如下图:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2003-8-51744490.jpg

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

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

(未完待续)

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

这篇文章算是对我前段时间学习的一个学习总结,以及对自己学习过程的一个回顾。本文通过一个简单的例子来尽可能的展示VCL组件开发的各个方面,本文针对即将学习组件开发的初学者,如果你已经熟悉组件开发或认为本...
  • jenhy
  • jenhy
  • 2007年09月23日 22:44
  • 505

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

通过实例看VCL组件开发全过程   这篇文章算是对我前段时间学习的一个学习总结,以及对自己学习过程的一个回顾。本文通过一个简单的例子来尽可能的展示VCL组件开发的各个方面,本文针对即将学习组件开发的初...
  • hkbarton
  • hkbarton
  • 2003年08月05日 11:05
  • 2111

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

(接上文)组件的代码由于假设你已经熟悉delphi开发(它和一般开发没什么不同),我们就直接贴出来并加上适当的注释: unit Clock; interface uses  SysUtils, Cla...
  • hkbarton
  • hkbarton
  • 2003年08月05日 11:03
  • 909

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

(接上文)四、组件属性编辑器和组件编辑器:通过上面的努力我们的组件似乎已经比较完美了,可我们也忽略了一些重要的细节和一些有趣的事情,这一篇我们将研究两个很有用的组件特性:在之前开发组件核心功能时我们曾...
  • hkbarton
  • hkbarton
  • 2003年08月08日 08:37
  • 1322

VCL组件开发

4.1 TObject分支     下面几部分分别对包含于五个主要分支中的类做出简要地描述,为完整地说明VCL对象的分层结构,引用了包含于产品中的VCL对象分层结构图。     所有的VCL对象都...
  • ghevinn
  • ghevinn
  • 2014年05月13日 11:54
  • 1865

Delphi 7学习开发控件

我们知道使用Delphi快速开发,很大的一方面就是其强大的VCL控件,另外丰富的第三方控件也使得Delphi程序员更加快速的开发出所需要的程序。在此不特别介绍一些概念,只记录自己学习开发控件的步骤。...
  • akof1314
  • akof1314
  • 2011年02月25日 17:06
  • 9901

JS面向对象及组件开发

面向对象的组成 无标题文档 var arr = []; arr.number = 10; //对象下面的变量:叫做对象的属性 //alert( arr.number ); //al...
  • pkgray
  • pkgray
  • 2014年08月16日 19:01
  • 17431

Vcl控件详解

TTabControl 属性  DisplayRect:只定该控件客户区的一个矩形 HotTrack:设置当鼠标经过页标签时,它的字是否有变化。如果为True,是字会变成蓝色 Images:为...
  • qq_31834115
  • qq_31834115
  • 2016年08月18日 16:16
  • 360

使用Eclipse从下载到编写一个实例全过程

步骤一、下载: (注意:方括号中为我所下载的内容以及我进行的一些操作,可能随着时间的推移发生变化,到时候自己变通下……) 需要下载的工具至少有以下2个: 1、Eclipse:推荐在官...
  • wan26com
  • wan26com
  • 2014年10月13日 02:18
  • 324

《Inside VCL(深入核心——VCL架构剖析)》.(李维) 一

一、回到从前:1.1、多任务操作系统是如何设计和实现的? 1.1.1、系统——多个应用程序 方案1:(系统不断读取应用程序状态) 系统通过大型循环(Loop)不断坚持么一个恶用用程序是否触发了特定的事...
  • liang08114
  • liang08114
  • 2016年12月20日 21:03
  • 532
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过实例看VCL组件开发全过程(三)
举报原因:
原因补充:

(最多只允许输入30个字)