有人说过“不会开发控件的Delphi程序员不是真正的程序员”。Delphi正是由于高度的可扩展性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光。即使是由于工作需要使用其他开发工具的开发者也常常怀念和Delphi度过的日日夜夜。接触Delphi已经一年多了,从当初对着Delphi组件面板上上百个控件不知所措,到现在已经可以根据需要开发一些有一定难度的控件,其中走过的路是十分艰辛的,所以特此写下这篇文章,将自己的经验留给后来者,也算是献给“同门师弟”的一份厚礼吧!
需要说明的一点是:在写这篇文章之前我假设读者已经对面向对象的基本知识有一定的了解,所以对于文章中面向对象相关的概念将不再展开讲述。
一、牛刀小试-TURLLabel控件
我们从一个能够添加超链接的标签控件开始我们的控件开发之旅吧!
既然是Label我们就从Tlabel派生这个控件吧(其实从TcustomLabel派生最好,不过出于简单的目的我们这里先从Tlabel派生)!
1、选择“File”->“New”->“Component”,将弹出如下的对话框:
在Ancestor type中选择Tlabel,ClassName中填入TURLLabel(名字可以任意取,但是要以T开头,否则的话会出现注册控件时候的问题)。这里Ancestor type代表控件的基类,TURLLabel代表控件的名称。
2、超链接的视觉效果是带下划线的文字,所以我们覆盖父类的构造函数,在构造函数里修改控件的字体属性。
constructor TUrlLabel.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Cursor:=crHandPoint;
Font.Style:= [fsUnderline];
end;
代码解释:
(1) inherited Create(AOwner);这句的意思是执行父类的构造函数。我们制作控件的时候,如果覆盖了父类的构造函数,那么在新的构造函数中一定要首先调用父类的构造函数,否则会引起错误。这是很多初学控件开发的人常常遇到的问题。当您把自己开发的控件从面板上拖放到窗体时,如果跳出一个“Access Violent”的错误对话框的话,那么十有八九是因为您忘了调用父类的构造函数。
(2) Cursor:=crHandPoint;
Font.Style:= [fsUnderline];
这三句的意思是修改标签的视觉效果。Cursor:=crHandPoint;是设定当鼠 标移动到控件上时鼠标的形状为“手型”;Font.Style:= [fsUnderline]; 是设定文字的下划线效果。
3、既然是超链接控件,那么我们肯定要能使用户在使用控件的时候能在“Object Inspector”中对超链接的URL进行修改,所以我们应该为控件增加一个Url属性。
属性是访问控件字段的接口。通过属性,控件使用者可以间接读或者写控件的内部字段改变控件的状态。组件属性的声明需要以下几部分:属性名、属性类型、读方法(或读字段)、写方法(或写字段。如果没有写方法或写字段,则该属性为只读属性)。属性在控件类声明的Published部分声明。在Published中声明的属性可以在设计期通过“Object Inspector”对属性值进行修改。如果声明在Public部分则不可以在设计期通过“Object Inspector”对属性值进行修改,但是可以在运行时通过代码进行读写。
在类声明的Private访问区域中添加如下字段声明:
FUrl: String;
在类声明中添加Published访问区域,并添加如下代码
property Url: String read FUrl write FUrl;
这段声明的意思是为控件添加一个Url属性,属性的类型是string,在读Url属性时返回Furl的值,在写 Url属性时设定Furl的值。
4、超链接的视觉效果有了,下面使它点击时调用浏览器打开Url指定的网址。
在Delphi控件的事件处理中很多事件都有对应的一个调度方法(这是设计模式中模板模式的典型应用)。比如在鼠标点击控件时,控件会首先调用Click方法,由Click方法进行相应的处理,而绝大多数调度方法都会引发一个事件句柄(关于事件句柄我们后边有深入的介绍)。比如Tlabel控件中在用户用点击Label时会首先调用控件的Click方法(被声明为Protected级别),Click方法再触发OnClick事件。所以我们只要覆盖Tlabel的Click方法进行我们自己的处理就可以了。
在Protected部分添加如下的声明:
procedure Click;override;
在实现部分为Click方法写如下的代码:
procedure TUrlLabel.Click;
begin
ShellExecute(Application.Handle, nil, PChar(Url), nil, nil,SW_NORMAL);
inherited;
end;
代码解释:
(1) ShellExecute的作用是用默认的程序打开第三个参数指定的文件。所以当第三个参数为一个URL时,则用浏览器打开这个网址。关于ShellExecute其他参数的使用方法可以查阅MSDN或其他相关资料。
(2) Inherited;的作用是调用父类的Click方法来由父类来对鼠标单击事件做其他的处理。
5、源代码。
下面给出这个控件的全部源代码:
unit UrlLabel;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Shellapi,
Graphics, Forms;
type
TUrlLabel = class(TLabel)
private
FUrl:AnsiString;
protected
procedure Click;override;
public
constructor Create(AOwner:TComponent);override;
published
property Url:AnsiString read FUrl write FUrl;
end;
procedure Register;
implementation
constructor TUrlLabel.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Cursor:=crHandPoint;
Font.Style:=[fsUnderline];
end;
procedure TUrlLabel.Click;
begin
ShellExecute(Application.Handle, nil, PChar(Url), nil, nil,SW_NORMAL);
inherited;
end;
procedure Register;
begin
RegisterComponents('Linco', [TUrlLabel]);//控件生成向导生成的注册控件用代码
end;
end.
6、为控件添加图标。
如果没有给自定义的控件定义图标,出现在控件面板上的自定义图标的图标是默认的图标,很没有“个性”,也不容易被用户与其他控件区别开来,所以我们需要给组件指定一个图标。
首先利用Delphi的Image Editor创建一个24*24的位图,并把它保存到一个DCR文件中。创建了一个位图后,就需要给位图命名了。位图的名称必须和控件的类名相同,且为大写,而DCR文件的名字则必须与控件所在单元的单元名相同。如我们上边定义的控件,位图的名字应该为TURLLABEL,DCR文件的名字应该是UrlLabel.dcr,此DCR文件应该与组件的单元文件放在同一个目录下。
打开Image Editor,选择”File”->“New” ->“Component Resource File(.dcr)”,如下图:
在“Contents”上单击鼠标右键,选择“New”->“BitMap”:
在Width,Height中都填入24,点“OK”即可。
可以在Bitmap1上点右键选择“Rename”为位图重命名为TURLLABEL,然后双击TURLLABEL,就可以像使用“画图”一样为您的控件设计图标了。
7、注册组件。
点击Componet->Install Componet进行自定义组件安装,此时将出现组件安装对话框。
在Unit FilName 中输入控件单元文件的文件名(包括路径),点击“OK”,在弹出的Package Editor 中按下Install按钮。如果安装成功系统就会提示安装成功。关闭Package Editor时,会提示您是否保存修改,点击Yes即可。
安装成功,建立一个测试程序。将URLLabel控件放到窗体上,设定Url属性为http://www.sohu.com 运行程序,点击此Label,就会弹出浏览器打开http://www.sohu.com这个网址。
思考题:
1、如何为控件添加一个图标?
2、Delphi中的控件的共同基类是哪个类?
3、请做一个编辑框控件,当控件中输入的字符串是网址(以http://开头)且用户在编辑框上按回车时,用浏览器打开此网址。
分享到:
相关推荐
《Delphi控件开发浅入深出》是一本专为Delphi初学者和进阶者设计的教程,旨在深入解析Delphi控件的开发过程,帮助读者掌握这一强大的Windows应用程序开发工具。Delphi以其高效的VCL(Visual Component Library)框架...
Delphi 控件开发浅入深出是 Delphi 程序员的必读书籍之一。 Delphi 的高度可扩展性和大量的第三方控件支持是吸引无数程序员挑剔的目光的根本原因。掌握 Delphi 控件开发是每个 Delphi 程序员的必备技能。 一、控件...
delphi控件开发。需要安装超星阅览器查看。
在《Delphi控件开发浅入深出》一书中,作者强调了Delphi强大的可扩展性以及丰富的第三方控件支持,这对于开发者来说是非常重要的特性。特别是对于那些希望深入学习Delphi编程的人来说,掌握控件开发技巧是非常有价值...
《Delphi控件使用大全》是一本专注于Delphi编程中控件应用的综合教程,旨在帮助开发者通过实例学习和理解...无论是初学者还是经验丰富的开发者,都能从中获益匪浅,加深对Delphi控件使用的掌握,提升软件开发效率。
与一般的控件包不同的是,CnPack开发包除了包括大量的组件外,还包括用于IDE扩展的专家包、大量的通用窗体库、数据桌面、组件编写工具等辅助开发工具,以及一个版本控制系统等等与Delphi软件开发相关的代码、文档和...
这本书深入浅出地介绍了如何利用Delphi 7强大的数据库支持功能,进行高效且灵活的数据管理应用程序开发。Delphi 7是Borland公司推出的一款集成开发环境(IDE),以其高效的编译器和组件化编程而著名,尤其在数据库...
在 Delphi 开发环境中,为组件添加立体阴影和投影效果是一项常见的美化任务,这可以使用户界面看起来更加丰富和专业。Delphi 提供了一些内置的方法来实现这样的视觉效果,虽然可能不如现代图形库那样细腻,但对于...
《Delphi开发经验技巧宝典》是一本专为Delphi开发者编写的书籍,内容涵盖了大量的实用技巧与示例代码,旨在帮助读者提高开发效率、解决实际问题。本书包含1000多个实例,每个实例都围绕着一个特定的技术点展开,并...
《Delphi2006 DbExpress高效数据库开发》是一本深度探讨如何利用DbExpress框架进行高效数据库应用开发的专业教程。DbExpress是Embarcadero Delphi(原Borland Delphi)提供的一种轻量级、跨数据库的访问层技术,它...
总的来说,《D10 Delphi 10.1 Berlin FireDAC 数据库开发手册》是一份全面的参考资料,对于想要精通Delphi数据库开发的程序员来说,无论是初学者还是有经验的开发者,都能从中获益匪浅。通过深入学习并结合源代码...
### Delphi简明教程知识点概览 #### 一、Delphi概述与发展历程 ...本书强调理论与实践相结合,通过丰富的示例和深入浅出的解释,帮助读者迅速掌握Delphi开发的核心技术,进而在Windows应用程序开发领域取得显著进展。
通过学习《Delphi 深入核心VCL架构剖析》,开发者不仅可以提升Delphi编程技能,还能对Windows应用程序的开发有更深的理解,为构建更复杂、更高效的软件奠定坚实的基础。书中提供的源代码分析将有助于实践和巩固理论...
总的来说,《Delphi深度历险》附书源码为 Delphi 学习者提供了一条深入理解和实践 Delphi 开发的途径,无论你是初学者还是经验丰富的开发者,都能从中获益匪浅。通过探索这些源代码,你将能够巩固理论知识,提升实际...
《Delphi精要》这本书是面向程序员的...总之,《Delphi精要》这本书深入浅出地介绍了Delphi编程的各项关键点,通过源代码的学习,读者可以全面掌握Delphi的开发技能,无论是初学者还是经验丰富的开发者,都能从中受益。
《Active控件部件指南》是一本专为VB(Visual Basic)爱好者设计的入门参考资料,它深入浅出地介绍了如何在VB环境中使用Active控件进行软件开发。Active控件是Microsoft在其Visual Studio系列中引入的一种重要组件,...
VCL Style是Delphi中用于定制界面外观的一种机制,允许开发者自定义控件的样式和布局,使其符合特定的应用场景或者个人喜好。"Windows 10 IDE Dark/Light VCL Style Theme"则专门针对Windows 10的界面风格进行了优化...