Delphi 控件开发教程
Delphi 控件开发浅入深出 一) 控件开发浅入深出(一
第 1 页,总 52 页
有人说过“不会开发控件的 Delphi 程序员不是真正的程序员”。Delphi 正是由于高度的可扩展 性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光。 即使是由于工作需要使用其他开 发工具的开发者也常常怀念和 Delphi 度过的日日夜夜。 接触 Delphi 已经一年多了, 从当初对着 Delphi 组件面板上上百个控件不知所措, 到现在已经可以根据需要开发一些有一定难度的控件, 其中走过的路是十分艰辛的, 所以特此写下这篇文章, 将自己的经验留给后来者, 也算是献给 “同 门师弟”的一份厚礼吧! 需要说明的一点是: 在写这篇文章之前我假设读者已经对面向对象的基本知识有一定的了解, 所 以对于文章中面向对象相关的概念将不再展开讲述。 一、牛刀小试-TURLLabel 控件 我们从一个能够添加超链接的标签控件开始我们的控件开发之旅吧! 既然是 Label 我们就从 Tlabel 派生这个控件吧(其实从 TcustomLabel 派生最好,不过出于简单 的目的我们这里先从 Tlabel 派生)! 1、选择“File”->“New”->“Component”,将弹出如下的对话框:
在 Ancestor type 中选择 Tlabel,ClassName 中填入 TURLLabel(名字可以任意取,但是要以 T 开头,否则的话会出现注册控件时候的问题)。这里 Ancestor type 代表控件的基类,TURLLabel 代表控件的名称。
Delphi 控件开发教程
第 2 页,总 52 页
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 属性。
Delphi 控件开发教程
第 3 页,总 52 页
属
性是访问控件字段的接口。 通过属性, 控件使用者可以间接读或者写控件的内部字段改变控件 的状态。组件属性的声明需要以下几部分:属性名、属性类型、读方法(或读字段)、写方法(或 写字段。如果没有写方法或写字段,则该属性为只读属性)。属性在控件类声明的 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 控件的事件处理中很多事件都有对应的一个调度方