其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi面向对象的编程方法(八)


发布日期:2022年11月30日
 
Delphi面向对象的编程方法(八)

重载一个方法

您可以重载(Override)一个方法通过在后代对象中说明一个与祖先对象重名的方法就可以重载一个方法如果想使这个方法在后代对象中作和祖先对象中一样的工作但是使用不同的方式时您就可以重载这个方法Delphi不推荐您经常重载方法除非您想建立一个新的部件重载一个方法Delphi编译器不会给出错误或警告提示信息

对象公有域和私有域的说明

当使用Delphi的环境来建立应用程序时您可以在一个TForm的后代对象中加入数据域和方法也可以通过直接修改对象类型说明的方法来为一个对象加上域和方法而不是把一个部件加入窗体或事件处理过程中

您可以在对象的Public或Private部分加入新的数据域和方法Public和Private是Object Pascal的保留字当您在工程中加入新的窗体时Delphi开始建立这个新窗体对象每一个新的对象都包含public和private指示以便您在代码中加入数据域和方法在public部分中说明其它库单元中对象的方法也可以访问的数据域或方法在private部分的说明有访问的限制如果您在private中说明域和方法那么它在说明这个对象的库单元外是不透明的而且不能被访问private中可以说明只能被本库单元方法访问的数据域和本库单元对象访问的方法过程或函数的程序代码可以放在库单元的implementation部分

访问对象的域和方法

当您想要改变一个窗体对象的一个域的某个属性或是调用它的一个方法时您必须在这个属性名称或调用方法之前加上这个对象的名称例如如果您的窗体上有一个编辑框部件而您需要在运行中改变它的Text属性需要编写下列的代码

EditText := Welcome to Delphi;

同样清除编辑框部件中选中的文本可以调用TEdit部件的相应方法

EditClearSelection;

如果您想改变一个窗体对象中一个对象域的多个属性或调用多个方法时使用with语句可以简化您的程序with语句在对象中可以和在记录中一样方便地使用下面的事件处理过程在响应OnClick事件时会对一个列表框作多个调整

procedure TFormButtonClick(Sender:TObject);

begin

ListBoxClear;

ListBoxMultiSelect :=True;

ListBoxItemAdd(One);

ListBoxItemAdd(Two);

ListBoxItemAdd(Three);

ListBoxSorted :=Ture;

ListBoxFontStyle :=[fsBold];

ListBoxFontColor :=clPurple;

ListBoxFontName :=Times New Roman;

ListBoxScaleBy();

end;

如果使用了With语句则程序如下

procedure TFormButtonClick(Sender:TObject);

begin

with (ListBox) do

begin

Clear;

MultiSelect :=True;

ItemAdd(One);

ItemAdd(Two);

ItemAdd(Three);

Sorted :=Ture;

FontStyle :=[fsBold];

FontColor :=clPurple;

FontName :=Times New Roman;

ScaleBy();

end;

end;

使用with语句您不必在每一个属性或方法前加上ListBox标识符在With语句之内所有的属性或调用方法对于ListBox这个对象而言都是在它的范围内的

对象变量的赋值

如果两个变量类型相同或兼容您可以把其中一个对象变量赋给另一个对象变量例如对象TForm和TForm都是从TForm继承下来的类型而且Form和Form已被说明过那么您可以把Form赋给Form:

Form :=Form;

只要赋值的对象变量是被赋值的对象变量的祖先类型您就可以将一个对象变量赋给另一个对象变量例如下面是一个TDataForm的类型说明在变量说明部分一共说明了两个变量AForm和DataForm

type

TDataForm = class(TForm)

Button:TButton;

Edit:TEdit;

DataGrid:TDataGrid;

Database:TDatabase;

TableSet:TTableSet;

VisibleSession:TVisibleSession;

private{私有域说明}

public{公有域说明}

end;

var

AForm:TForm;

DataForm:TDataForm;

因为TDataForm是TForm类型的后代所以Dataform是AForm的后代因此下面的赋值语句是合法的

AForm :=DataForm;

这一点在Delphi中是极为重要的让我们来看一下应用程序调用事件处理过程的过程下面是一个按钮部件的OnClick事件处理过程

procedure TFormButtonClick(Sender:TObject);

begin

end;

您可以看到TObject类在Delphi的Visual Component Library的顶部这就意味着所有的Delphi对象都是TObject的后代因为Sender是TObject类型所以任何对象都可以赋值给它虽然您没有看见赋值的程序代码但事实上发生事件的部件或控制部件已经赋给Sender了这就是说Sender的值是响应发生事件的部件或控制部件的

您可以使用保留字is来测试Sender以便找到调用这个事件处理过程的部件或控制部件的类型Delphi中的一个显示draganddrop的DRAGDROPDPR工程加载它可以查阅到DROPFONTPAS库单元的代码在MemoDragOver方法中检查了一个对象变量的类型在这种情形下参数是Source而不是Sender

procrdure TFormMemoDragOver(SenderSource:TObject;XY:integer;

State:TDragState;var Accept:Boolean);

begin

Accept :=Source is TLabel;

end;

Source参数也是TObject类型Source被赋值为那个被拖曳的对象用MemoDragOver方法的目的是确保只有标签可以被拖曳Accept是布尔型参数如果Accept为True那么用户选择的部件可以被拖曳反之当Accept的值为False时用户就不可以拖曳选择控制部件is保留字检查Source是否TLabel的类型所以Accept只有在用户拖曳一个标签时才为真并作为变参输出到函数之外

下面的draganddrop展示的MemoDragDrop事件处理过程中也使用了Source参数这个方法是为了把Memo部件的字型改变成和放入这个备注控制部件的标签一样的字型

procedure TFormMemoDragDrop(SenderSource:TObject;XY:Integer);

begin

MemoFont := (Source as TLabel)Font;

end;

当您在这个事件处理过程中编写赋值语句时开发人员并不知道用户会放入哪一个标签只有通过参考这个标签的名称(Source as TLabel)用户才能知道并把标签类型赋给MemoTFontSource包含了用户拖放控制部件的名称只有当Source是一个标签时这个事件处理过程才允许这个赋值发生

建立非可视化对象

您在Delphi中使用的大部分对象都是您在设计和运行期间可以看见的部件例如编辑框按钮等一些部件如通用对话框(Common dialog box)等在设计时看不见而在运行时可以看见另外有些部件例如计时器(Timer)数据源(Data Source)部件等在程序的运行期间没有任何可视化的显示但您却可以在您的应用程序中使用它们

说明一个非可视化对象

下面通过一个简单的例子讲述如何建立自己的非可视化对象

您可以用如下的方法建立一个自己的TEmployee非可视化对象

type

Temployee = class(TObject);

Name := String[];

Title := String[];

HourlyPayRate : Double;

function CalculatePayAmount:Double;

end;

在这种情况下TEmployee从TObject继承下来且包含三个域和一个方法把您建立的类型说明放在库单元中的说明部分并和窗体说明放在一起在这个程序库单元的变量说明部分说明一个新类型的变量

var

Employee : TEmployee;

用Create方法建立对象实例

TEmployee只是一个对象类型除非通过一个构造函数的调用从而被实例取代或创建否则一个对象并不存储在内存中构造函数是一个方法它为新对象配置内存并且指向这个新的对象这个新的对象也被称为这个对象类型的一个实例

建立一个对象的实例需要调用Create方法然后构造函数把这个实例赋给一个变量如果您想说明一个TEmployee类型的实例在您访问这个对象的任何域之前您的程序代码必须调用Create

Employee := TEmployeeCreate;

Create方法并没有在TEmployee类型中说明它继承自TObject类型因为TEmployee是TObject的子类所以它可以调用Create方法而创建一个TEmployee实例然后把它赋给Employee变量在创建了一个这样的对象后您就可以象使用其他的Delphi对象一样访问Employee对象了

撤销对象

当您使用完对象后您应该及时撤销它以便把这个对象占用的内存释放出来您可以通过调用一个注销方法来撤销您的对象它会释放分配给这个对象的内存

Delphi的注销方法有两个Destroy和FreeDelphi建议使用Free因为它比Destroy更为安全同时调用Free会生成效率更高的代码

您可以用下列的语句释放用完的Employee对象

EmployeeFree;

和Create方法一样Free方法也是TEmployee从TObject中继承过来的把您的注销放在try…finally程序模块的finally部分而把对象的程序代码放在try部分是编程的好习惯这样即使您的程序代码在使用对象时发生了异常事件也会确保您为这个对象分配的内存会被释放关于异常处理和try…finally程序模块的信息以及建立非可视化对象的例子在后文中还将仔细讲述

               

上一篇:从TurboPascal到Delphi

下一篇:谈Delphi编程中资源文件的应用