在delphi中编写控件的基本方法
作为delphi程序员,要想进一步提高编程水平就必须掌握控件的编写方法,本篇文章将通过一个简单的例子来为初学者介绍编写控件的一些基本方法和模式。
这个例子控件叫tleilabel,是在tlabel的基础上增加两个实用的功能:一是使文字具有立体形状,二是使文字具有超链接属性。下面就让我们一步步来实现这些功能。
一、使文字具有立体形状
首先定义类型t3deffect和属性style3d分别如下:
t3deffect=(normal,raised,lowered, shadowed);
property style3d:t3deffect read fstyle3d write setstyle3d default normal;
再在private中定义变量:“fstyle3d:t3deffect;”,并设置setstyle3d()方法如下,这也是写方法的一般格式:
procedure tleilabel.setstyle3d(value: t3deffect);
begin
if fstyle3d <> value then
begin
fstyle3d := value;
invalidate; //表示控件将重画
end;
end;
另外对于带阴影的文字还要定义阴影的偏移量shadexoffset和shadeyoffset:
property shadowxoffset: integer read fxoffset write setfxoffset default 5;
property shadowyoffset: integer read fyoffset write setfyoffset default -5;
写方法setfxoffset()、setfyoffset()和上面的setstyle3d()类似。
要重画控件一般要重载paint方法,此处只是重画文字,我们只需重载dodrawtext方法。
dodrawtext的声明放在protected中:
procedure dodrawtext(var rect: trect; flags: longint); override;
此处dodrawtext()根据四种类型(正常、凸起、凹进和阴影)分别画出不同的文字。
二、使文字具有超链接属性
定义一个属性url表示要链接的网址或email地址。
property url : string read furl write seturl;
写方法seturl如下:
procedure tleilabel.seturl(value: string);
begin
if furl <> value then furl := value ;
if furl <> '' then
cursor := crhandpoint;
end;
当点击此label时要打开浏览器或收发邮件工具,这便要重载click方法。
procedure click; override;
procedure tleilabel.click;
var s: string;
begin
inherited click;
if furl = '' then exit;
if lowercase(copy(furl,1,7)) = 'http://' then
s := furl
else if pos('@',furl) <> 0 then
s := 'mailto:' + furl
else
s := 'http://' + furl;
shellexecute(application.handle, 'open', pchar(s), nil, nil, sw_shownormal);
end;
一般的超链接当鼠标移入时文字的颜色发生变化。为此加上属性hovercolor,表示鼠标移入时文字的颜色。
property hovercolor : tcolor read fhovercolor write sethovercolor default clred;
还要定义两个接收windows消息cm_mouseenter和cm_mouseleave(鼠标移进和移出)的过程:
procedure cmmouseenter(var message: tmessage); message cm_mouseenter;
procedure cmmouseleave(var message: tmessage); message cm_mouseleave;
procedure tleilabel.cmmouseenter (var message: tmessage);
begin
if enabled and visible and getparentform(self).active then
begin
ffontcolor := font.color;
//将文字的颜色保存起来
font.color := fhovercolor;
//改变文字颜色
end;
end;
procedure tleilabel.cmmouseleave (var message: tmessage);
begin
font.color:=ffontcolor;
//恢复文字原来的颜色
end;
为设置属性的默认值,我们还需要重载构造create(),注意,重载构造时必须首先调用祖先类的构造。重载构造create()的程序如下:
constructor tleilabel.create(aowner: tcomponent);
begin
inherited create(aowner);
//必须首先调用祖先类的构造
fstyle3d := normal;
fxoffset := 5;
fyoffset := -5;
fhovercolor := clred;
end;
最后,还必须为这个控件加上图标。我们可以用delphi中的image editor来创建一个24×24的bitmap位图,保存为一个dcr文件,文件名必须与控件的pas文件名相同,位图名必须与控件名相同且全部大写。