Delphi控件,我们也可以

翻译|其它|编辑:郝浩|2004-02-17 17:35:00.000|阅读 1874 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

Delphi是一个强大的开发工具,它有很多动人之处,其中之一就是开放性。它是一个完全开放的系统。当IDE中原有的控件不能满足我们所需时,可以添加第三方的控件。相信每一个Delphi程序员都见识过大名鼎鼎的AHM和LMD以及RxLib等第三方控件包。但这些控件包也并非完美无缺。当这些控件也不能完全满足我们时,有没有想过自己写一个来用呢?

  当然,这不一定是一件轻而易举的事。Delphi的权威书籍《Delphi5开发人员指南》中也指出,开发控件的Delphi程序员通常都是高手,因为他们除了要了解一般的Delphi编程知识,更要对Delphi本身以及操作系统的一些高级知识有所了解。当然,想开发出一个受欢迎的控件,还要了解客户的需求,这就是超越技巧的东西了。

  相信很多初学者就此望而却步了,其实,有时菜鸟与高手只有一步之遥。想不想跨过去,体验一下高手的感觉?

  做一个真正的高手可能很难,但做一个控件就未必了。现在我们就来做一个。它并不复杂,但绝对有着完整的功能,而且它符合Delphi6的体系,同时提供了VCL和CLX两个类库的组件,可移植性良好。事实上,我在工作中就已经在用它了。

  现在我们完整地体验一下这个开发过程。 实践第一步——分析和设计

  Delphi为我们提供的组件中,有一个Label控件,它完成了最基本的单行文本标签功能。不过它的功能实在是太有限啦,总是在那里灰不溜秋地趴着。现在我们给它增加点动态效果,让它成为一个可以在鼠标经过时改变外表的标签——TouchLabel。也就是说,在Label的基础上,我们要给它添加几个属性,使鼠标经过时,标签的的文字效果会变为我们指定的样子。那么,我们要扩充的功能分为以下几部分:

1、两个属性及其对应的属性编辑器,为它指定MouseMoving时的背景色和前景色。

2、在鼠标经过标签上时,改变标签的外观。

3、鼠标移出后,把外观改为原来的样子。

分析这三个功能,需要用到以下的技术:

  自义属性,事实上把属性定义为Publish类型,并为它指定对应的Read和Write方法,它就会出现在属性编辑器中。现在我们把这两个属性命名为TouchBKColor和TouchFont。现在看一下我的属性定义:

property TouchBKColor : TColor Read GetTouchBKColor Write SetTouchBKColor

stored isStoreTouchBKColor default clWindow;

property TouchFont : TFont Read FTouchFont Write SetTouchFont

stored isStoreTouchFont;

  stored是标识这个属性是否要保存在程序的.dfm中以做持久化,通常它由一个返回值为 Boolean 类型的函数来控制。这里是isStoreTouchBKColor 和isStoreTouchFont。而default是用来为这个属性指定一个默认值。另外,我还定义了一个属性来判断是否需要让这个Touch功能生效。就是

property ChangeWhileTouch : Boolean Read isStoreTouchFont

Write isStoreTouchFont default True;

  这些代码并不复杂,我直接将它们附在后面,在这里就不多占篇幅了。只有两点要指出,一个是在属性本身的Read和Write方法中不可以对属性本身进行读写,否则会引起无穷递归。还有一个是属性本身不保存信息,通常的做法是在读写方法中操作某一私有字段。

  “事件”响应,这不是平时我们所用的事件响应,而是为鼠标进出控件编写对应的代码。在VCL和CLX中,采用的是不同的方法。VCL的消息体系和Windows的消息体系比较接近,我们要找出鼠标进出控件的消息,写对应的消息响应代码。而CLX是基于著名的C++跨平台类库QT开发的。所以它采用的是QT的信号——槽机制。好在CLX可视控件的基础类TControl为我们封装了MouseEnter和MouseLeave,我们只要重载这两个成员方法,写上我们自己的代码。而在VCL和CLX的TouchLabel组件中,这些代码完全通用。方法载很简单,我介绍一下消息响应。

VCL的消息响应:

  当然,我们先要找到鼠标出入控件的消息。别以为我这是废话,Borland公司的技术资料之糟糕和他们出色的开发工具一样举世闻名,而这两个消息又不是windows的标准消息,所以我们要自己去找。告诉你一个秘密,VCL的消息列表在Controls单元中。我就是在那里找到了CM_MOUSEENTER和CM_MOUSELEAVE消息。现在我们学习一下Delphi的消息响应方法的格式:

procedure procedureName(var Message: Tmessage); Message TheMessage;

  procedure关键字说明消息响应是一个方法,procedureName是你为它起的名字,它的参数是可以先照抄,后面的TheMessage就是你要这个方法响应的消息。

所以,我们定义这两个方法为

procedure TTouchLabel.CMMouseEnter(var Message: TMessage);

begin

inherited;

if not ChangeWhileTouch then exit;

if FColor <> FTouchColor then

begin

FTempColor := Color;

Color := TouchBKColor;

end;

FTempFont.Assign(Font);

Font.Assign(TouchFont);

end;


procedure TTouchLabel.CMMouseLeave(var Message: TMessage);

begin

inherited;

if not ChangeWhileTouch then exit;

if FColor <> FTouchColor then

Color := FTempColor;

Font.Assign(FTempFont);

end;

  在CLX版本中,只是方法的声明不同,实现代码是一样的,所以不多说了。最后要指出的是,这里面我们会用到对象类型的成员,一定要记着自己定义,自己构造,自己析构。 实践第二步——动手做

先启动Delphi6,选择File菜单下的New|Other...在New Items中选“Package”,起个好名字,把 它存好,这是封装组件的包文件。



图2:新的包从这里添加

  再它的Package界面上点Add按钮,弹出的Add对话框中选New Component页面,在Ancestor type中选TLabel [QstdCtrls],ClassName为TTouchLabel, Palette Page 是你要把它放在哪一个组件板上,可以自己指定一个新的噢。在 Unit file name 中指定好文件名(存好啊)。点OK,在Package中就可以看到这个.pas文件了,它就是我们一会儿要添加的CLX 控件。再ADD 一个, Ancestor type选TLabel [StdCtrls],文件名不要起重,其它一样,这就是VCL组件。



图3:添加新控件——注意“Ancestor type”,那是组件的父类,也就是你要从哪个类派生出你自己的新控件。 然后双击你所要编辑的文件,把代码对应着填进去,就可以Compile了。没什么问题的话,点击Install安装,成功后会有提示信息告诉你,有哪些组件安装成功了。记着在Tools菜单选Environment Options, 再选Library页,在Library Path和Browsing path中Add 进你的代码所保存的目录。这样你就可以使用刚刚加入的组件了。

  其实,还有一个方法,把我的代码保存为.pas文件,在Add组件时,选Add Unit页, 把文件加进来就可以了。



图4:你也可以省点事

  通过这次实践,我们应当会对Delphi6的组件管理、消息体系、CLX构架有所了解。现在高手之路已经在你的脚下了。成为真正的高手的一个障碍,你已经跨了过去,恭喜你!



图5:我自己的组件板,你也会有的

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP