实践第一步——分析和设计
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组件中,这些代码完全通用。方法载很简单,我介绍一下消息响应。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器