程序库单元的初始化部分
初始化当前库单元所使用的数据或是通过interface部分将数据提供给其他应用程序库单元使用时您可以在库单元中加入一个initialization部分在库单元的end前加上您的初始化语句当一个应用程序使用一个库单元时在库单元中的initialization部分会先于其他的代码执行如果一个应用程序使用了多个库单元则每一个库单元的初始化部分都会在所有的程序代码前执行
使用Delphi的可视化部件及其库单元
当您在窗体中加入可视化部件时如果该部件在可视化部件库中Delphi会在您的库单元的interface部分的uses子句中自动加上需要使用的库单元名称但有些对象在Delphi的环境中并没有可视化部件存在例如您想在库单元中加入一个预定义的信息框则您必须把MsgDlg库单元加入您的uses子句中如果您要使用TPrinter对象的话必须将Printer库单元加入uses子句中在在线帮助中可以查到对象所属的预定义库单元
要使用在其他库单元中说明的函数应在函数的前面加上这一库单元的名称并用号隔开例如要在Unit中使用Unit中说明的Calculate函数应使用下面的方法
Number := UnitCalculate();
您可以在任何标识符如属性常量变量数据类型函数等之前加上库单元的名称您可以在自由地在任何Delphi库单元中加入程序代码但不要改变由Delphi生成的程序
建立与窗体无关的新库单元
如果您想在工程中建立一个和任何窗体无关的新库单元可以现选用File|New Unit这时一个新的库单元加入了工程新库单元的代码如下
unit Unit;
interface
implementation
end
Delphi将根据您的工程中的文件数目为您的库单元选择名称您可以在程序骨架间加入您的程序代码
当编译您的工程时这个新加入的库单元会被编译为一个具有DCU后缀的文件这个新生成的文件是链接到工程的可执行文件上的机器代码
将库单元加入工程
将库单元加入工程是比较简单的无论是您自己建立的库单元还是Delphi建立的与窗体有关的库单元如果已经完成则先打开您想加入库单元的工程(可以用Open Project打开工程)再选用File|Open File然后选择您想加入的源程序(PAS文件)并选择OK即可则库单元被加入到应用程序中
用Delphi的对象进行编程
Delphi是基于面向对象编程的先进开发环境面向对象的程序设计(OOP)是结构化语言的自然延伸OOP的先进编程方法会产生一个清晰而又容易扩展及维护的程序一旦您为您的程序建立了一个对象您和其他的程序员可以在其他的程序中使用这个对象完全不必重新编制繁复的代码对象的重复使用可以大大地节省开发时间切实地提高您和其他人的工作效率
什么是对象
一个对象是一个数据类型对象就象记录一样是一种数据结构按最简单的理解我们可以将对象理解成一个记录但实际上对象是一种定义不确切的术语它常用来定义抽象的事务是构成应用程序的项目其内涵远比记录要丰富在本书中对象可被理解为可视化部件如按钮标签表等
了解对象最关键的是掌握对象的特性一个对象其最突出的特征有三个封装性继承性多态性
对象的封装性
对对象最基本的理解是把数据和代码组合在同一个结构中这就是对象的封装特性将对象的数据域封闭在对象的内部使得外部程序必需而且只能使用正确的方法才能对要读写的数据域进行访问封装性意味着数据和代码一起出现在同一结构中如果需要的话可以在数据周围砌上围墙只有用对象类的方法才能在围墙上打开缺口
对象的继承性
继承性的含义直接而且显然它是指把一个新的对象定义成为已存在对象的后代新对象继承了旧类的一切东西在往新对象中添加任何新内容以前父类的每一个字段和方法都已存在于子类中父类是创建子类的基石
对象的多态性
多态性是在对象体系中把设想和实现分开的手段如果说继承性是系统的布局手段多态性就是其功能实现的方法多态性意味着某种概括的动作可以由特定的方式来实现这取决于执行该动作的对象多态性允许以类似的方式处理类体系中类似的对象根据特定的任务一个应用程序被分解成许多对象多态性把高级设计处理的设想如新对象的创建对象在屏幕上的重显程序运行的其它抽象描述等留给知道该如何完美的处理它们的对象去实现
通过Delphi实例了解对象
让我们结合Delphi的实例讨论对象的概念:
当您要建立一个新工程时Delphi 将显示一个窗体作为设计的基础在程序编辑器中Delphi将这个窗体说明为一个新的对象类型并同时在与窗体相关联的库单元中生成了创建这个新窗体对象的程序代码
unit Unit;
interface
uses SysUtils Windows Messages Classes Graphics Controls Forms Dialogs;
type
TForm = class(TForm) {窗体的类型说明开始}
private{ Private declarations }
public{ Public declarations }
end; {窗体的类型说明结束}
var
Form: TForm; {说明一个窗体变量}
implementation
{$R *DFM}
end
新的窗体类型是TForm它是从TForm继承下来的一个对象它具有对象的特征含有域或方法由于您未给窗体加入任何部件所以它只有从TForm类中继承的域和方法在窗体对象的类型说明中您是看不到任何域方法的说明的Form称为TForm类型的实例(instance)您可以说明多个对象类型的实例例如在多文档界面(MDI)中管理多个子窗口时就要进行这样的说明每一个实例都有自己的说明但所有的实例却共用相同的代码
假设您向窗体中加入了一个按钮部件并对这个按钮建立了一个OnClick事件处理过程再查看Unit的源程序会发现TForm的类型说明部分如下
type
TForm = class(TForm)
Button: TButton;
procedure ButtonClick(Sender: TObject);
private{ Private declarations }
public{ Public declarations }
end;
现在TForm对象有了一个名为Button的域它是您在窗体中加入的按钮TButton是一个对象类型Button是Tbutton的一个实例它被TForm对象所包含作为它的数据域每当您在窗体中加入一个部件时部件的名称就会作为TFom的域加入到类型说明中来在Delphi中您所编写的事件处理过程都是窗体对象的方法每当您建立一个事件处理过程就会在窗体的对象类型中说明一个方法
当您使用Object Inspector来改变对象(部件)的名称时这个名称的改变会反映到程序中例如在Object Inspector中将Form的Name属性命名为ColorBox您会发现在类型说明部分会将前文的TForm改为
TColorBox=class(TForm);
并且在变量说明部分会说明ColorBox为TColorBox类型的变量由Delphi自动产生的事件处理过程名称会自动改为TColorBoxButtonClick但您自行编写的实现部分的代码却不会被自动修改因此如果您在改变Name属性前编写了程序则您必须将事件处理过程中的对象名称进行改变所以原先的FormColor要改为ColorBoxColor
从一个对象中继承数据和方法
前面的TForm类型是很简单的因为它只含有域Button和方法ButtonClick但是在这个窗体上您可以改变窗体的大小加入或删除窗体的最大最小化按钮或设置这个窗体为MDI界面对于一个只包含一个域和方法的对象来讲您并没有看到显式的支持程序在窗体上单击鼠标或用Object Inspector的上端的Object Selector选中Form对象按动F查阅它的在线帮助您会在Properties和Method中找到它的继承到的全部属性和方法这些是在TForm类型中说明的TForm是TForm的子类直接继承了它所有的域方法属性和事件例如窗体的颜色属性Color就是在TForm中说明的当您在工程中加入一个新窗体时就等于加入了一个基本模型通过不断地在窗体中加入部件您就自行定义了一个新的窗体要自定义任何对象您都将从已经存在的对象中继承域和方法建立一个该种对象的子类例如对象TForm就被说明为对象TForm的子类拥有一个窗体部件的基本属性或方法只有当您在窗体中加入了部件或编写了事件处理过程时Form才成为您自己的类型
一个比较特殊的对象是从一个范围较广或较一般的对象中继承下来的它是这个特别对象的祖先这个对象则称为祖先的后代一个对象只能有一个直接的祖先但是它可以有许多后代TForm是TForm类型的祖先所有的窗体对象都是TForm的后代
用F查阅窗体的在线帮助时您会发现TForm被称为component(部件)这是因为所有的部件都是对象
在这个结构中所有的部件都是对象部件类型TComponent从TObject类型中继承数据和程序代码并具有额外的可以用作特殊用途的属性方法事件所以部件可以直接和用户打交道记录它的状态并存贮到文件中等等控制类型TControl从TComponent中继承而来又增加了新的功能如它可以显示一个对象在上图中虽然TCheckBox不是直接由TObject继承来的但是它仍然有任何对象所拥有的属性因为在VCL结构中TCheckBox终究还是从TObject 中继承了所有功能的特殊对象但它还有些自行定义的独到的功能如可以选择记录状态等
对象的范围
关于对象的范围
一个对象的范围决定了它的数据域属性值方法的活动范围和访问范围在一个对象的说明部分说明的数据域属性值方法都只是在这个对象的范围中而且只有这个对象和它的后代才能拥有它们虽然这些方法的实际程序代码可能是在这个对象之外的程序库单元中但这些方法仍然在这个对象的范围内因为它们是在这个对象的说明部分中说明的
当您在一个对象的事件处理过程中编写程序代码来访问这个对象的属性值方法或域时您不需要在这些标识符之前加上这个对象变量的名称例如如果您在一个新窗体上加入一个按钮和一个编辑框并为这个按钮编写OnClick事件处理过程
procedure TFormButtonClick(Sender:Tobject);
begin
Color :=clFuchsia;
EditColor :=clLime;
end;
其中的第一行语句是为整个窗体Form着色您也可以编写如下
FormColor :=clFuchsia;
但您可以不必加上Form因为ButtonClick方法是在TForm对象的范围里当您在一个对象的范围中时您可以省略所有这个对象中的属性值方法域之前的对象标识符但是当您编写第二个语句改变编辑框的底色时因为此时您想访问的是TEdit对象的Color属性而不是TForm类型的所以您需要通过在属性前面加上编辑框的名称来指明Color属性值的范围如果不指明Delphi会象第一个语句一样将窗体的颜色变成绿色因为Edit部件是在窗体中的它是窗体的一个数据域所以您同样不必指明其从属关系
如果Edit是在其他窗体中那么您需要在编辑框之前加上这个船体对象的名称了例如如果Edit是在Form之中那它是Form说明的一个数据域并位于Form的范围中那么您需要将第二句改为
FormEditColor := clLime;
而且需要把Unit加入Unit的uses子句中
一个对象的范围扩展到这个对象的所有后代TForm的所有属性值方法和事件都在TForm的范围中因为TForm是TForm的后代您的应用程序不能说明和祖先的数据域重名的类型变量等如果Delphi显示了一个标识符被重复定义的信息就有可能是一个数据域和其祖先对象(例如TForm)的一个数据域有了相同的名称可以尝试改变这个标识符的名称