当前位置:首页 > 网络编程 > 软件语言 > DELPHI > Delphi面向对象的编程方法(八)

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

点击次数:79 次 发布日期:2008-11-09 08:44:19 作者:源代码网
源代码网推荐
广告载入中
55.重载一个方法 

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

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

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

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



  57. 访问对象的域和方法 

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

  Edit1.Text := "Welcome to Delphi";

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

  Edit1.ClearSelection; 

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

  procedure TForm1.Button1Click(Sender:TObject);
  begin
  ListBox1.Clear;
  ListBox1.MultiSelect :=True;
  ListBox1.Item.Add("One");
  ListBox1.Item.Add("Two");
  ListBox1.Item.Add("Three");
  ListBox1.Sorted :=Ture;
  ListBox1.FontStyle :=[fsBold];
  ListBox1.Font.Color :=clPurple;


  ListBox1.Font.Name :="Times New Roman";
  ListBox1.ScaleBy(125,100);
  end; 

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

  procedure TForm1.Button1Click(Sender:TObject);
  begin
  with (ListBox1) do
  begin
  Clear;
  MultiSelect :=True;
  Item.Add("One");
  Item.Add("Two");
  Item.Add("Three");
  Sorted :=Ture;
  FontStyle :=[fsBold];
  Font.Color :=clPurple;
  Font.Name :="Times New Roman";
  ScaleBy(125,100);
  end;
  end; 

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

  58. 对象变量的赋值 

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



  Form2 :=Form1;

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

  type
  TDataForm = class(TForm)
  Button1:TButton;
  Edit1:TEdit;
  DataGrid1:TDataGrid;
  Database1:TDatabase;
  TableSet1:TTableSet;
  VisibleSession1:TVisibleSession;
  private{私有域说明}
  public{公有域说明}
  end;
  var
  AForm:TForm;
  DataForm:TDataForm;

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

  AForm :=DataForm;

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

  procedure TForm1.Button1Click(Sender:TObject);

  begin
  end;

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

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

  procrdure TForm1.Memo1DragOver(SenderSource:TObject;X,Y:integer;
  State:TDragState;var Accept:Boolean);
  begin
  Accept :=Source is TLabel;
  end;  

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

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

  procedure TForm1.Memo1DragDrop(SenderSource:TObject;X,Y:Integer);
  begin
  Memo1.Font := (Source as TLabel).Font;
  end; 

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

  59. 建立非可视化对象 

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

  60.说明一个非可视化对象 

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

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

  type
  Temployee = class(TObject);
  Name := String[25];
  Title := String[25];
  HourlyPayRate : Double;
  function CalculatePayAmount:Double;
  end; 

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

  var
  Employee : TEmployee; 

  61.用Create方法建立对象实例 

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

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

  Employee := TEmployee.Create; 

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

  62. 撤销对象 

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

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

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

  Employee.Free; 

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

源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华