当您使用Object Inspector来改变对象(部件)的名称时,这个名称的改变会反映到程序中。例如,在Object Inspector中将Form1的Name属性命名为ColorBox,您会发现在类型说明部分,会将前文的TForm1改为: TColorBox=class(TForm); 并且在变量说明部分,会说明ColorBox为TColorBox类型的变量,由Delphi自动产生的事件处理过程名称会自动改为TColorBox.Button1Click;但您自行编写的实现部分的代码却不会被自动修改。因此,如果您在改变Name属性前编写了程序,则您必须将事件处理过程中的对象名称进行改变。所以,原先的Form1.Color要改为ColorBox.Color。 2.2.2 从一个对象中继承数据和方法 前面的TForm1类型是很简单的,因为它只含有域Button1和方法Button1Click。但是在这个窗体上,您可以改变窗体的大小、加入或删除窗体的最大最小化按钮,或设置这个窗体为MDI界面。对于一个只包含一个域和方法的对象来讲,您并没有看到显式的支持程序。在窗体上单击鼠标或用Object Inspector的上端的Object Selector选中Form1对象,按动F1查阅它的在线帮助,您会在Properties和Method中找到它的继承到的全部属性和方法。这些是在TForm类型中说明的,TForm1是TForm的子类,直接继承了它所有的域、方法、属性和事件。例如窗体的颜色属性Color就是在TForm中说明的。当您在工程中加入一个新窗体时,就等于加入了一个基本模型。通过不断地在窗体中加入部件,您就自行定义了一个新的窗体。要自定义任何对象,您都将从已经存在的对象中继承域和方法,建立一个该种对象的子类。例如对象TForm1就被说明为对象TForm的子类,拥有一个窗体部件的基本属性或方法。只有当您在窗体中加入了部件或编写了事件处理过程时,Form1才成为您自己的类型。 一个比较特殊的对象是从一个范围较广或较一般的对象中继承下来的,它是这个特别对象的祖先,这个对象则称为祖先的后代。一个对象只能有一个直接的祖先,但是它可以有许多后代。TForm是TForm1类型的祖先,所有的窗体对象都是TForm的后代。 用F1查阅窗体的在线帮助时,您会发现TForm被称为component(部件)。这是因为所有的部件都是对象。 在这个结构中所有的部件都是对象。部件类型TComponent从TObject类型中继承数据和程序代码,并具有额外的可以用作特殊用途的属性、方法、事件,所以部件可以直接和用户打交道,记录它的状态并存贮到文件中等等。控制类型TControl从TComponent中继承而来,又增加了新的功能,如它可以显示一个对象。在上图中,虽然TCheckBox不是直接由TObject继承来的,但是它仍然有任何对象所拥有的属性,因为在VCL结构中,TCheckBox终究还是从TObject 中继承了所有功能的特殊对象,但它还有些自行定义的独到的功能,如可以选择记录状态等。 2.2.3 对象的范围 2.2.3.1 关于对象的范围 一个对象的范围决定了它的数据域、属性值、方法的活动范围和访问范围。在一个对象的说明部分说明的数据域、属性值、方法都只是在这个对象的范围中,而且只有这个对象和它的后代才能拥有它们。虽然这些方法的实际程序代码可能是在这个对象之外的程序库单元中,但这些方法仍然在这个对象的范围内,因为它们是在这个对象的说明部分中说明的。 当您在一个对象的事件处理过程中编写程序代码来访问这个对象的属性值、方法或域时,您不需要在这些标识符之前加上这个对象变量的名称。例如,如果您在一个新窗体上加入一个按钮和一个编辑框,并为这个按钮编写OnClick事件处理过程: procedure TForm1.Button1Click(Sender:Tobject); begin Color :=clFuchsia; Edit1.Color :=clLime; end; 其中的第一行语句是为整个窗体Form1着色。您也可以编写如下: Form1.Color :=clFuchsia; 但您可以不必加上Form1.,因为Button1Click方法是在TForm1对象的范围里。当您在一个对象的范围中时,您可以省略所有这个对象中的属性值、方法、域之前的对象标识符。但是当您编写第二个语句改变编辑框的底色时,因为此时您想访问的是TEdit1对象的Color属性,而不是TForm1类型的,所以您需要通过在属性前面加上编辑框的名称来指明Color属性值的范围。如果不指明,Delphi会象第一个语句一样,将窗体的颜色变成绿色。因为Edit1部件是在窗体中的,它是窗体的一个数据域,所以您同样不必指明其从属关系。 如果Edit1是在其他窗体中,那么您需要在编辑框之前加上这个船体对象的名称了。例如,如果Edit1是在Form2之中,那它是Form2说明的一个数据域,并位于Form2的范围中,那么您需要将第二句改为: Form2.Edit1.Color := clLime; 而且需要把Unit2加入Unit1的uses子句中。 一个对象的范围扩展到这个对象的所有后代。TForm的所有属性值、方法和事件都在TForm1的范围中,因为TForm1是TForm的后代。您的应用程序不能说明和祖先的数据域重名的类型、变量等。如果Delphi显示了一个标识符被重复定义的信息,就有可能是一个数据域和其祖先对象(例如TForm)的一个数据域有了相同的名称。可以尝试改变这个标识符的名称。 2.2.3.2 重载一个方法 您可以重载(Override)一个方法。通过在后代对象中说明一个与祖先对象重名的方法,就可以重载一个方法。如果想使这个方法在后代对象中作和祖先对象中一样的工作但是使用不同的方式时,您就可以重载这个方法。Delphi不推荐您经常重载方法,除非您想建立一个新的部件。重载一个方法,Delphi编译器不会给出错误或警告提示信息。 2.2.4 对象公有域和私有域的说明 当使用Delphi的环境来建立应用程序时,您可以在一个TForm的后代对象中加入数据域和方法,也可以通过直接修改对象类型说明的方法来为一个对象加上域和方法,而不是把一个部件加入窗体或事件处理过程中。 您可以在对象的Public或Private部分加入新的数据域和方法。Public和Private是Object Pascal的保留字。当您在工程中加入新的窗体时,Delphi开始建立这个新窗体对象。每一个新的对象都包含public和private指示,以便您在代码中加入数据域和方法。在public部分中说明其它库单元中对象的方法也可以访问的数据域或方法。在private部分的说明有访问的限制。如果您在private中说明域和方法,那么它在说明这个对象的库单元外是不透明的,而且不能被访问。private中可以说明只能被本库单元方法访问的数据域和本库单元对象访问的方法。过程或函数的程序代码可以放在库单元的implementation部分。 2.2.5 访问对象的域和方法 当您想要改变一个窗体对象的一个域的某个属性,或是调用它的一个方法时,您必须在这个属性名称或调用方法之前加上这个对象的名称。例如,如果您的窗体上有一个编辑框部件,而您需要在运行中改变它的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这个对象而言都是在它的范围内的。  
2/2 首页 上一页 1 2 |