📄 154.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://bbs.tsinghua.edu.cn"><font face="黑体"><big><big>水木清华★</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> Delphi编程 (BM: strayli FlyingBoy) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="454"> <p align="center">[<a href="index.htm">回到开始</a>][<a href="7.htm">上一层</a>][<a href="155.htm">下一篇</a>]
<hr><p align="left"><small>发信人: seader (海哥), 信区: Delphi <br>
标 题: 开发自己的Delphi构件 <br>
发信站: BBS 水木清华站 (Fri Oct 9 21:33:49 1998) WWW-POST <br>
<br>
开发自己的Delphi构件 <br>
<br>
廖为民 <br>
<br>
Borland公司推出的可视化编程工具Delphi已经受到众多程序员的青睐,越来越多 <br>
的人开始学习使用Delphi来开发各类应用程序。但如何编写自己的Delphi构件对许多 <br>
Delphi程序员来说还是比较陌生的,很多参考书中也未曾提及这一点。因此,有必要掌 <br>
<br>
握构件的编写方法。 <br>
<br>
一、构件编写的基础知识 <br>
<br>
1. Delphi构件源文件包的基本构成 <br>
<br>
(1)*.PAS文件:程序语言文件,是程序员编写的程序源代码; <br>
<br>
(2)*.FRM文件:窗体描述文件,是程序员所用窗体以及窗体类各种构件特征的具 <br>
<br>
体描述(如大小、位置等); <br>
<br>
(3)*.DCR文件:动态构件资源文件,定义构件登记时显示在构件工具栏上的位 <br>
图; <br>
<br>
(4)*.RES文件:资源源文件,定义构件包要用到的资源。 <br>
<br>
此外,有些构件还可能用到*.DCU、*.OBJ、*.DLL等文件。 <br>
<br>
2. 面向对象PASCAL的继承与封装 <br>
<br>
Delphi构件实际上是从TComponent类继承发展而来的子类,编写构件实质上就是 <br>
编写特殊的类,因而有必要掌握面向对象PASCAL的类语法,而类最重要的两个特征就是 <br>
<br>
继承与封装。 <br>
<br>
(1) 类的继承 <br>
<br>
在PASCAL中,类的继承是指从一个父类(TParentClass)继承得到子类 <br>
(TNewClass),语法格式如下: <br>
<br>
Type <br>
<br>
<br>
TNewClass = Class (TParentClass) <br>
<br>
…… <br>
<br>
(2) 类的封装 <br>
<br>
PASCAL用关键字Private、Protected、Public和Published来实现类的封装。 <br>
<br>
1)Private:用Private声明过的变量、过程及函数是私有的,只能被类中的其它 <br>
<br>
函数、过程使用,对于类的外部是不可见的。 <br>
<br>
2)Protected:在Protected部分说明的变量、函数、过程,可以被本类及其子 <br>
类使用。 <br>
<br>
3)Public:在Pulic部分说明的变量、函数及过程可以被允许使用类单元的任何 <br>
程序单元使用。 <br>
<br>
4)Published:在Published部分说明的变量,如构件在Object Inspector栏 <br>
中显示的属性及事件,可在程序设计时使用。 <br>
<br>
3. 在构件中重载父类的方法和增加新的方法 <br>
<br>
如果想修改父类中的某个方法,则首先应该弄清该方法是否能够被重载。如果该方 <br>
法 <br>
在父类和祖始类中的非私有部分被作过virtual或dynamic定义,则可重载。当你重载一 <br>
<br>
个方法时,首先必须在interface区的Private、Protected及Public中的任一部分说 <br>
明函数原型并在尾部加上关键字override,然后在implementation区定义其实现代 <br>
码。 <br>
<br>
在Delphi构件编写中增加新的方法非常容易,只需在interface区的Private、 <br>
Protected及Public中的任一部分描述函数原型(若方法可能在以后被重载,则应在尾 <br>
部加上virtual或dynamic关键字),然后在implementation区定义方法的具体实现 <br>
代码。 <br>
<br>
4. 为构件增加属性 <br>
<br>
Delphi中用关键字property声明属性字段,属性有read和write可选从句(如果只 <br>
使用read从句,则属性便是只读的)。其语法格式为: <br>
<br>
property MyProperty: Atype <br>
<br>
read GetProperty write SetProperty; <br>
read GetProperty write SetProperty; <br>
<br>
或 <br>
<br>
property MyProperty: Atype <br>
<br>
read FProperty write SetProperty; <br>
<br>
注意:GetProperty、SetProperty分别为读、写属性过程,FProperty为变量。 <br>
<br>
5. 为构件增加事件 <br>
<br>
Delphi的编程方法被称为事件驱动编程。例如,当用户按下按钮时便触发了一个 <br>
Click事件,程序员在编程过程中所做的事情便是定义事件触发后的处理过程。 <br>
<br>
在Delphi中,事件也是使用关键字property来声明的。其语法格式为: <br>
<br>
property OnNewEvent: AEventType <br>
<br>
read FOnNewEvent write FOnNewEvent; <br>
<br>
声明事件后往往要将Windows的消息传递与事件联系起来才能真正实现事件驱动。因 <br>
<br>
<br>
此,我们还要增加一种新的特殊类型的动态的“消息管理”方法。其语法格式为: <br>
<br>
procedure MsgPro(var Msg: Tmessage); message AMsgIndex; <br>
<br>
其中,关键字message声明此为一个消息管理方法。AmsgIndex为一整数常数,作 <br>
Windows消息动态索引,当索引为AmsgIndex的消息传递至应用程序时便会执行MsgPro <br>
过程。为了将消息管理方法与事件联系起来,可在MsgPro过程中放入如下的代码,其作 <br>
<br>
用是查看FonEvent是否正指向一个有效的过程,若指向则执行此过程,这样就将事件处 <br>
理过程与消息联系在一起了。 <br>
<br>
…… <br>
<br>
Begin <br>
<br>
Inherited; <br>
<br>
If assigned(FOnNewEvent) then <br>
<br>
FonNewEvent(self); <br>
<br>
End; <br>
End; <br>
<br>
6. 设计构件登记过程 <br>
<br>
当构件类编写完成以后,所要做的事情就是设计如何将构件放到构件工具栏中。在 <br>
<br>
Delphi中,可用Register过程来完成。 <br>
<br>
Register过程的说明必须放在单元的interface区,过程的具体代码则应放到单元 <br>
的implementation区中。 <br>
<br>
例如,要将TmyComponent构件登记到构件栏的Samples页,其代码如下: <br>
<br>
Interface <br>
<br>
…… <br>
<br>
Procedure Register; <br>
<br>
Implementation <br>
<br>
Procedure Register; <br>
<br>
<br>
Begin <br>
<br>
RegisterComponents('Samples',[TMyComponent]); <br>
<br>
End; <br>
<br>
7. 编写构件时可能会用到的重要工具Object Browser <br>
<br>
要想真正掌握构件的编写,就必须深入了解类的层次与结构,可通过Delphi开发包 <br>
<br>
中的Browser工具来清楚地查看类的层次、结构等,但Browser只有在程序编译后才可 <br>
用。如果想要知道某一构件的结构和层次,则可将它放入一个空窗体进行编译,再用 <br>
Browser来查看。关于Browser的具体用法,可参考Delphi的帮助手册,在此不再赘 <br>
述。 <br>
<br>
二、编写构件的基本步骤 <br>
<br>
下面要开发的新构件TnewLabel是从TLabel类继承来的,它与Tlabel具有相似的 <br>
焦点感应能力:当鼠标移到TLabel上时,文字颜色发生改变;当鼠标离开时,颜色恢 <br>
复。它还将增加一个EnterTextColor属性以及OnMouseEnter和OnMouseLeave事件。 <br>
属性EnterTextColor中可以输入鼠标进入构件时文字的颜色,OnMouseEnter、 <br>
OnMouseLeave事件中则可输入程序员自己的代码来指定鼠标进入、离开构件时的动作。 <br>
<br>
<br>
1. 选中Component菜单项中的New Component选项。在Ancestor Type框中填入 <br>
TLabel,在Class Name框中填入TNewLabel,在Palette Page框中填入Samples, <br>
在Unit File Name框中填入NewCom.pas,然后单击按钮Create Unit就进入到代码 <br>
编辑状态。 <br>
<br>
2. 使用Tools菜单中的Image Editor来创建编辑文件NewCom.dcr,为 <br>
TNewLabel类建立位图。 <br>
<br>
3. 增加新属性EnterTextColor,并为读写属性增加私有方法 <br>
SetEnterTextColor和私有变量FEnterTextColor。 <br>
<br>
键入如下的代码: <br>
<br>
Private <br>
<br>
FEnterTextColor::TColor; <br>
<br>
SetEnterTextColor(AColor:TColor); <br>
<br>
Published <br>
Published <br>
<br>
Property EnterTextColor:TColor <br>
<br>
Read FEnterTextColor write SetEnterTextColor(AColor); <br>
<br>
… <br>
<br>
Implementation <br>
<br>
Procedure TNewLabel.SetEnterTextColor(AColor:TColor); <br>
<br>
Begin <br>
<br>
FEnterTextColor:=AColor; <br>
<br>
End; <br>
<br>
4. 增加事件OnMouseEnter和OnMouseLeave。 <br>
<br>
加入如下的代码: <br>
<br>
Private <br>
Private <br>
<br>
FOnMouseEnter,FOnMouseLeave:TNotifyEvent; <br>
<br>
Published <br>
<br>
OnMouseEnter:TNotifyEvent <br>
<br>
read FOnMouseEnter write FOnMouseEnter; <br>
<br>
OnMouseLeave:TnotifyEvent <br>
<br>
Read FOnMouseLeave write FOnMouseLeave; <br>
<br>
…… <br>
<br>
5. 增加保护方法MouseEnter、MouseLeave、CM_MouseEnter和 <br>
CM_MouseLeave。 <br>
<br>
加入如下的代码: <br>
<br>
protected <br>
<br>
<br>
procedure MouseEnter;virtual; procedure MouseLeave;virtual; <br>
<br>
procedure CM_MouseEnter(var msg:TMessage);message <br>
CM_MOUSEENTER; <br>
<br>
procedure CM_MouseLeave(var msg:TMessage);message <br>
CM_MOUSELEAVE; <br>
<br>
…… <br>
<br>
Implementation <br>
<br>
Procedure MouseEnter; <br>
<br>
Begin <br>
<br>
If assigned(FOnMouseEnter) Then <br>
<br>
FOnMouseEnter(self); <br>
<br>
End; <br>
<br>
<br>
Procedure CM_MouseEnter(var msg:Tmessage); <br>
<br>
Begin <br>
<br>
Inherited; <br>
<br>
MouseEnter; <br>
<br>
End; <br>
<br>
6. MosueLeave、CM_MouseLeave的实现代码与MouseEnter、CM_MouseEnter <br>
的类似。Delphi为所有消息提供缺省处理。在写消息句柄时应禁止缺省处理,因此在 <br>
CM_MouseEnter和CM_MouseLeave过程中调用了inherited。 <br>
<br>
重载构造和析构方法的代码如下: <br>
<br>
Public Constructor Create( AOwner : TComponent ); override; <br>
Destructor Destroy; override; <br>
<br>
…… <br>
<br>
Implementation <br>
<br>
Constructor Create( AOwner : TComponent ); <br>
<br>
Begin <br>
<br>
inherited Create(AOwner); <br>
<br>
FLeaveTextColor:=Font.Color; <br>
<br>
FEnterTextColor:=Font.Color; <br>
<br>
End; <br>
<br>
Destructor TNewLabel.Destroy; <br>
<br>
Begin <br>
<br>
Inherited Destroy; <br>
<br>
End; <br>
<br>
上述构件开发过程是在Delphi 3.0中进行的。 <br>
elphi 3.0中进行的。 <br>
<br>
当你安装好这个构件并测试后,你会发现它还不错:Delphi构件的编写竟是如此容 <br>
<br>
易而又充满乐趣! <br>
<br>
当然,构件的编写相对于普通应用程序的开发来说要困难一些,但是一旦你能够熟 <br>
练 <br>
地开发各种构件时,则从中得到的好处是值得你花费一些时间去掌握它的。 <br>
<br>
<br>
-- <br>
<br>
快乐的海哥 <br>
<br>
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.5.44] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="7.htm">上一层</a>][<a href="155.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -