Borland公司推出的可视化编程工具Delphi已经受到众多程序员的青睐,越来越多
的人开始学习使用Delphi来开发各类应用程序。但如何编写自己的Delphi构件对许多
Delphi程序员来说还是比较陌生的,很多参考书中也未曾提及这一点。因此,有必要掌
握构件的编写方法。
一、构件编写的基础知识
1. Delphi构件源文件包的基本构成
(1)*.PAS文件:程序语言文件,是程序员编写的程序源代码;
(2)*.FRM文件:窗体描述文件,是程序员所用窗体以及窗体类各种构件特征的具
体描述(如大小、位置等);
(3)*.DCR文件:动态构件资源文件,定义构件登记时显示在构件工具栏上的位
图;
(4)*.RES文件:资源源文件,定义构件包要用到的资源。
此外,有些构件还可能用到*.DCU、*.OBJ、*.DLL等文件。
2. 面向对象PASCAL的继承与封装
Delphi构件实际上是从TComponent类继承发展而来的子类,编写构件实质上就是
编写特殊的类,因而有必要掌握面向对象PASCAL的类语法,而类最重要的两个特征就是
继承与封装。
(1) 类的继承
在PASCAL中,类的继承是指从一个父类(TParentClass)继承得到子类
(TNewClass),语法格式如下:
Type
TNewClass = Class (TParentClass)
……
(2) 类的封装
PASCAL用关键字Private、Protected、Public和Published来实现类的封装。
1)Private:用Private声明过的变量、过程及函数是私有的,只能被类中的其它
函数、过程使用,对于类的外部是不可见的。
2)Protected:在Protected部分说明的变量、函数、过程,可以被本类及其子
类使用。
3)Public:在Pulic部分说明的变量、函数及过程可以被允许使用类单元的任何
程序单元使用。
4)Published:在Published部分说明的变量,如构件在Object Inspector栏
中显示的属性及事件,可在程序设计时使用。
3. 在构件中重载父类的方法和增加新的方法
如果想修改父类中的某个方法,则首先应该弄清该方法是否能够被重载。如果该方
法
在父类和祖始类中的非私有部分被作过virtual或dynamic定义,则可重载。当你重载一
个方法时,首先必须在interface区的Private、Protected及Public中的任一部分说
明函数原型并在尾部加上关键字override,然后在implementation区定义其实现代
码。
在Delphi构件编写中增加新的方法非常容易,只需在interface区的Private、
Protected及Public中的任一部分描述函数原型(若方法可能在以后被重载,则应在尾
部加上virtual或dynamic关键字),然后在implementation区定义方法的具体实现
代码。
4. 为构件增加属性
Delphi中用关键字property声明属性字段,属性有read和write可选从句(如果只
使用read从句,则属性便是只读的)。其语法格式为:
property MyProperty: Atype
read GetProperty write SetProperty;
或
property MyProperty: Atype
read FProperty write SetProperty;
注意:GetProperty、SetProperty分别为读、写属性过程,FProperty为变量。
5. 为构件增加事件
Delphi的编程方法被称为事件驱动编程。例如,当用户按下按钮时便触发了一个
Click事件,程序员在编程过程中所做的事情便是定义事件触发后的处理过程。
在Delphi中,事件也是使用关键字property来声明的。其语法格式为:
property OnNewEvent: AEventType
read FOnNewEvent write FOnNewEvent;
声明事件后往往要将Windows的消息传递与事件联系起来才能真正实现事件驱动。因
此,我们还要增加一种新的特殊类型的动态的“消息管理”方法。其语法格式为:
procedure MsgPro(var Msg: Tmessage); message AMsgIndex;
其中,关键字message声明此为一个消息管理方法。AmsgIndex为一整数常数,作
Windows消息动态索引,当索引为AmsgIndex的消息传递至应用程序时便会执行MsgPro
过程。为了将消息管理方法与事件联系起来,可在MsgPro过程中放入如下的代码,其作
用是查看FonEvent是否正指向一个有效的过程,若指向则执行此过程,这样就将事件处
理过程与消息联系在一起了。
……
Begin
Inherited;
If assigned(FOnNewEvent) then
FonNewEvent(self);
End;
6. 设计构件登记过程
当构件类编写完成以后,所要做的事情就是设计如何将构件放到构件工具栏中。在
Delphi中,可用Register过程来完成。
Register过程的说明必须放在单元的interface区,过程的具体代码则应放到单元
的implementation区中。
例如,要将TmyComponent构件登记到构件栏的Samples页,其代码如下:
Interface
……
Procedure Register;
Implementation
Procedure Register;
Begin
RegisterComponents('Samples',[TMyComponent]);
End;
7. 编写构件时可能会用到的重要工具Object Browser
要想真正掌握构件的编写,就必须深入了解类的层次与结构,可通过Delphi开发包
中的Browser工具来清楚地查看类的层次、结构等,但Browser只有在程序编译后才可
用。如果想要知道某一构件的结构和层次,则可将它放入一个空窗体进行编译,再用
Browser来查看。关于Browser的具体用法,可参考Delphi的帮助手册,在此不再赘
述。
二、编写构件的基本步骤
下面要开发的新构件TnewLabel是从TLabel类继承来的,它与Tlabel具有相似的
焦点感应能力:当鼠标移到TLabel上时,文字颜色发生改变;当鼠标离开时,颜色恢
复。它还将增加一个EnterTextColor属性以及&#111nMouseEnter和&#111nMouseLeave事件。
属性EnterTextColor中可以输入鼠标进入构件时文字的颜色,&#111nMouseEnter、
&#111nMouseLeave事件中则可输入程序员自己的代码来指定鼠标进入、离开构件时的动作。
1. 选中Component菜单项中的New Component选项。在Ancestor Type框中填入
TLabel,在Class Name框中填入TNewLabel,在Palette Page框中填入Samples,
在Unit File Name框中填入NewCom.pas,然后单击按钮Create Unit就进入到代码
编辑状态。
2. 使用Tools菜单中的Image Editor来创建编辑文件NewCom.dcr,为
TNewLabel类建立位图。
3. 增加新属性EnterTextColor,并为读写属性增加私有方法
SetEnterTextColor和私有变量FEnterTextColor。
键入如下的代码:
Private
FEnterTextColor::TColor;
SetEnterTextColor(AColor:TColor);
Published
Property EnterTextColor:TColor
Read FEnterTextColor write SetEnterTextColor(AColor);
…
Implementation
Procedure TNewLabel.SetEnterTextColor(AColor:TColor);
Begin
FEnterTextColor:=AColor;
End;
4. 增加事件&#111nMouseEnter和&#111nMouseLeave。
加入如下的代码:
Private
F&#111nMouseEnter,F&#111nMouseLeave:TNotifyEvent;
Published
&#111nMouseEnter:TNotifyEvent
read F&#111nMouseEnter write F&#111nMouseEnter;
&#111nMouseLeave:TnotifyEvent
Read F&#111nMouseLeave write F&#111nMouseLeave;
……
5. 增加保护方法MouseEnter、MouseLeave、CM_MouseEnter和
CM_MouseLeave。
加入如下的代码:
protected
procedure MouseEnter;virtual; procedure MouseLeave;virtual;
procedure CM_MouseEnter(var msg:TMessage);message
CM_MOUSEENTER;
procedure CM_MouseLeave(var msg:TMessage);message
CM_MOUSELEAVE;
……
Implementation
Procedure MouseEnter;
Begin
If assigned(F&#111nMouseEnter) Then
F&#111nMouseEnter(self);
End;
Procedure CM_MouseEnter(var msg:Tmessage);
Begin
Inherited;
MouseEnter;
End;
6. MosueLeave、CM_MouseLeave的实现代码与MouseEnter、CM_MouseEnter
的类似。Delphi为所有消息提供缺省处理。在写消息句柄时应禁止缺省处理,因此在
CM_MouseEnter和CM_MouseLeave过程中调用了inherited。
重载构造和析构方法的代码如下:
Public Constructor Create( AOwner : TComponent ); override;
Destructor Destroy; override;
……
Implementation
Constructor Create( AOwner : TComponent );
Begin
inherited Create(AOwner);
FLeaveTextColor:=Font.Color;
FEnterTextColor:=Font.Color;
End;
Destructor TNewLabel.Destroy;
Begin
Inherited Destroy;
End;
上述构件开发过程是在Delphi 3.0中进行的https://www.xin3721.com/。
当你安装好这个构件并测试后,你会发现它还不错:Delphi构件的编写竟是如此容
易而又充满乐趣!
当然,构件的编写相对于普通应用程序的开发来说要困难一些,但是一旦你能够熟
练
地开发各种构件时,则从中得到的好处是值得你花费一些时间去掌握它的。
Delphi基础教程:开发自己的Delphi构件
作者:转载自:xin3721视频教程网更新时间:2010/10/19
- 视频教程在线观看
- Visual Basic从入门到精通视频教程
- 李天生SQL2008数据库视频教程
- 李天生二级VF考试视频教程
- 李天生Java软件开发高级视频教程
- 李天生Java软件开发高级教程
- C++从入门到精通视频教程
- 鹏哥C#语言从入门到高级视频教程
- 李天生JavaScript+JQuery视频教程
- VB教程:实例问题一则
- vb教程:实现多线程!
- vb教程:实现JPEG数据压缩
- VB教程:VB中调用VC++开发的DLL
- JAVA教程:UDP数据广播的局域网络会
- C语言教程:C 程序开发经典实例之6
- C语言教程:实现的闹钟程序
- 如何利用用C语言来解决鬼谷算题
- C语言教程:C 程序开发经典实例之一
- C语言教程:C 程序开发经典实例之2
- C语言教程:C 程序开发经典实例之3
- C语言教程:C 程序开发经典实例之5
- C语言教程:C语言程序设计技巧
- C语言教程:C 程序开发经典实例之7
- C语言教程:C 程序开发经典实例之8
- C语言教程:C 程序开发经典实例之9
- C语言教程:C 程序开发经典实例之1
- C语言教程:C 程序开发经典实例之4
- C语言教程:C语言入门
- 如何在VB.NET中取得计电脑的硬件信
- C语言教程:入门基础2
- C语言教程:入门基础
- C语言教程:写好C程序的10条秘籍
- 如何在VB.net中应用HOOK(二)
- VB.NET实例:删除文件时出错
- VB.NET实例:求一个因式分解的程序
- 关于MDI多文档编辑器的问题
- 如何产生不同的随机数?
- VB第三方控件实现XP资源管理器垂直
- VB第三方控件实现XP资源管理器垂直
- Delphi基础教程:开发分隔线组件
- Delphi基础教程:在程序中调用自己
- Delphi基础教程:面向组件的系统开
- Delphi基础教程:创建VCL 构件及开
- Delphi基础教程:编写ASP中的Activ
- Delphi基础教程:创建良好设计的代
- Delphi基础教程:从实作标题栏按钮
- Delphi基础教程:构件制作方法
- Delphi基础教程:开发自己的Delphi
- Delphi基础教程:改变VCL的行为--一
- Delphi基础教程:怎样获取未知DLL的
- Delphi基础教程:TQuery的结果到入
- Delphi基础教程:为什么要使用动态
- Delphi基础教程:在Delphi应用程序
- Delphi基础教程:Delphi中Memo组件
- Delphi基础教程:Delphi控制Excel2
- Delphi基础教程:Outlook的Automat
- Delphi基础教程:撰写及呼叫DLL程式
- Delphi基础教程:Delphi中实现OLE自
- Delphi基础教程:TQuery的结果到入
- Delphi基础教程:如何分析一个陌生
- Delphi基础教程:hook的dll源文件
- Delphi基础教程:DLL问题实例一则
- Delphi基础教程:利用Dll实现通用密
- Delphi基础教程:怎样在Delphi中调
- Delphi基础教程:修改Access数据库
- Delphi基础教程:用Delphi5编写调用
- Delphi基础教程:用Delphi编写DLL实
- Delphi基础教程:用Delphi制作DLL全
- Delphi基础教程:如何调试DLL型的向