AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > Delphi

第二章 Delphi面向对象的编程方法(三)

51自学网 http://www.51zixue.net

 

2.1.9.4 字符串类型 

        字符串类型事实上是一个一维的字符数组。当您说明一个字符串型的变量时,您应当指明这个字符串的大小,下面是说明字符串类型的例子:

type

MyString: string[15];

var

MyName: MyString; 

        则变量MyName被说明成为最多可以包含15个字符。如果您没有说明字符串的大小,Delphi会认为字符串包含最大值255个字符。给字符串赋值可以直接使用单引号括起的字串赋值: 

MyName := 'Frank.Smith';

MyName := '张明'; 

        因为MyName是一个可以包含15个字符的MyString型变量,上文的两个的变量都是有效的,一个汉字可以视作两个字符。当您给字符串型变量赋的值多于定义数值时,例如将MyName赋为‘FrankSmith.Franklin’,则Delphi只会接受前15个字符‘FrankSmith.Fran’。在内存中,字符串通常占用比所说明的大小多一个字节的空间,因为第一个位置是一个包含这个数组大小的字节。您可以使用索引值来访问字符串的字符,MyName[1]可以得到MyName的第一个字符'F'

         您可以使用Delphi丰富的运算符、过程和函数来处理字符串型的变量和属性。下面介绍几个常用的运算符和Delphi过程或函数:

         Concat(+)功能相同,都可以将多个字符串组合在一起,建立一个较大的字符串;Copy会返回一个字符串中的子字符串;Delete在一个字符串中从一个指定位置起删除一定数目的字符;Insert在一个字符串中插入一个字符串;Length返回字符串的长度;Pos返回一个子字符串在一个字符串中的位置,即索引值。 

2.1.9.5 集合类型 

         集合类型是一群相同类型元素的组合,这些类型必须是有限类型如整形、布尔型、字符型、枚举型和子界型。在检查一个值是否属于一个特定集合时,集合类型非常有用。下面的例程可以说明集合类型的用法:

         在窗体上加入一个编辑框和一个按钮,清除编辑框中的文字,在其上加上Caption为“输入元音”的标签Label,并在编辑框的下方加入一个空的标签,将按钮的Default属性改为True,建立按钮的事件处理过程如下: 

procedure TForm1.Button1Click(Sender:TObject);

type

Tvowels=set of Char;

var

Vowels:TVowels;

begin

Vowels := ['a','e','i','o','u'];

if Edit1.Text[1] in Vowels then

Lable2.Caption := '是元音';

else

Lable2.Caption := '请再试';

end; 

        执行这个程序,在编辑框中输入字母,表达式Edit1.Text[1] in Vowels的结果是布尔型的,in是运算符,用来判断字母是否存在于集合中。输入的判别结果会显示在编辑框的下方。以上就用到了集合类型TVowels。 

2.1.9.6 记录类型 

        记录是您的程序可以成组访问的一群数据的集合。下面的例程说明了一个记录类型的用法: 

type

TEmployee=record

Name : string[20];

YearHired:1990..2000;

Salsry: Double;

Position: string[20];

end; 

      记录包含可以保存数据的域,每一个域有一个数据类型。上文的记录TEmployee类型就含有四个域。您可以用以下的方式说明记录型的变量: 

var

NewEmployee,PromotedEmployee:TEmployee;

       用如下的方法可以访问记录的单域:

NewEmployee.Salary := 1000;

编写如下的语句可以给整个记录赋值: 

with PromotedEmployee do

begin

Name :='';

YearHired := 1993;

Salary := 2000.00

Position := 'editor';

end; 

       您的程序可以将记录当成单一实体来操作: 

PromptEmployee := NewEmployee;

     以上介绍了用户常用的自定义类型。在Delphi的编程中,对象是非常重要的用户自定义数据类型。象记录一样,对象是结构化的数据类型,它包含数据的域(Field),也包含作为方法的过程和函数。在Delphi中,当您向窗体中加入一个部件,也就是向窗体对象中加入了一个域;每一个部件也是对象,每当您建立一个事件处理过程使得部件可以响应一个事件时,您即自动地在窗体中加入了一个方法。在本章第2节中,将详细讲述Delphi面向对象编程的方法和技巧。 

2.1.10 Object Pascal的库单元Unit 

        Units是常量、变量、数据类型、过程和函数的集合,而且能够被多个应用程序所共享。Delphi已经拥有许多预定义的程序库单元可供您建立您的程序库单元使用。DelphiVisual Component Library由多个程序库单元组成,它们说明了对象、部件以供您的应用程序用来设计用户界面。例如,当您在窗体中加入一个Check Box时,Delphi自动在您的程序库单元中加入了Stdctrls库单元,因为TCheckBox部件是在StdCtrls库单元中说明的。

       当您设计您的窗体时,Delphi自动建立一个和您的窗体有关的库单元。您的库单元不必都和窗体有关,也可以使用预定义的只包含数学运算函数的库单元,或是自行编写数学函数库单元。在一个库单元中所有的说明都相互有关系,例如,CDialogs程序库单元包含了在您的应用程序中使用的普通对话框的所有说明。 

2.1.10.1 Object Pascal程序库单元的结构 

       不管一个库单元是否和一个窗体有关,库单元的结构都是相同的。其结构如下: 

unit <库单元名称> 

interface 

uses <选择性的库单元列表>

{公有说明} 

implementation 

uses <选择性的库单元列表>

{私有说明}

{过程和函数的执行部分}

    initialization {选择性的}

{选择性的初始化程序}

end. 

2.1.10.2 程序库单元的接口部分 

        interface是库单元的接口部分,它决定了本库单元对其他任何库单元或程序的可见(可访问)部分。您可以在接口部分说明变量、常量、数据类型、过程和函数等等。Delphi在您设计窗体的库单元中,将窗体数据类型、窗体变量和事件处理过程都说明在这一部分。

       interface标志库单元接口部分的开始。在interface中的说明对要使用这些说明的其他库单元或应用程序是可见的。一个库单元可以使用其他Unit的说明,只需要在uses子句中指明那些库单元即可。例如,您在库单元A中编写程序代码,且您想调用UnitBinterface部分说明的程序。您可以把库单元B的名称加入到Ainterface部分的uses子句中,则任何A中的程序都可以调用B中说明的程序。而且,如果Binterface部分的uses子句中出现C库单元,尽管A中未曾出现CA同样可以调用BC库单元在interface中说明的程序。但如果B出现在Ainterface部分的uses子句中,那么库单元A便不能出现在Binterfaceuses子句中。因为这样会产生对库单元的循环访问。当试图编译时,会产生出现错误信息。 

2.1.10.3 程序库单元的实现部分 

        实现部分implementation中包含interface中说明的过程、函数、事件处理过程的具体实现程序代码。这一部分可以有自己的额外说明,但这些说明是私有的,外部程序不能调用这些说明。在interface中说明的函数实体必须在implementation部分出现,可以使用标题简写:只输入procedurefunction保留字,后面跟过程或函数的名称即可,其后则是程序的实现部分了。如果您在implementation部分说明任何常式,其标题并未出现在interface部分,则必须写全其标题部分。

        在implementation部分的uses子句中指定的库单元,只供给本库单元的程序使用其interface中说明的程序。其他使用本库单元的库单元,不能访问这些在implementationudes子句中库单元的说明,因为在implementation后进行的库单元包含是私有的。所以上例中,如果C出现在Bimplementation部分,则A不能使用C的公有部分,除非C出现在Auses子句中。在implementation中出现的循环访问是Delphi所允许的,如果Aimplemetationuses子句中出现B,则Bimplementation部分也可以出现A。 

2.1.10.4 程序库单元的初始化部分 

        初始化当前库单元所使用的数据,或是通过interface部分将数据提供给其他应用程序、库单元使用时,您可以在库单元中加入一个initialization部分,在库单元的end前加上您的初始化语句。当一个应用程序使用一个库单元时,在库单元中的initialization部分会先于其他的代码执行。如果一个应用程序使用了多个库单元,则每一个库单元的初始化部分都会在所有的程序代码前执行。 

2.1.10.5 使用Delphi的可视化部件及其库单元 

       当您在窗体中加入可视化部件时,如果该部件在可视化部件库中,Delphi会在您的库单元的interface部分的uses子句中自动加上需要使用的库单元名称。但有些对象在Delphi的环境中并没有可视化部件存在,例如,您想在库单元中加入一个预定义的信息框,则您必须把MsgDlg库单元加入您的uses子句中。如果您要使用TPrinter对象的话,必须将Printer库单元加入uses子句中。在在线帮助中可以查到对象所属的预定义库单元。

        要使用在其他库单元中说明的函数,应在函数的前面加上这一库单元的名称,并用‘.’号隔开。例如,要在Unit2中使用Unit1中说明的Calculate函数,应使用下面的方法:

Number := Unit1.Calculate(10);

         您可以在任何标识符如属性、常量、变量、数据类型、函数等之前加上库单元的名称。您可以在自由地在任何Delphi库单元中加入程序代码,但不要改变由Delphi生成的程序。 

2.1.10.6 建立与窗体无关的新库单元 

        如果您想在工程中建立一个和任何窗体无关的新库单元,可以现选用File|New Unit。这时一个新的库单元加入了工程,新库单元的代码如下: 

unit Unit2;

interface

implementation

end. 

         Delphi将根据您的工程中的文件数目为您的库单元选择名称,您可以在程序骨架间加入您的程序代码。

          当编译您的工程时,这个新加入的库单元会被编译为一个具有.DCU后缀的文件。这个新生成的文件是链接到工程的可执行文件上的机器代码。

 
 

上一篇:第二章 Delphi面向对象的编程方法(四)  下一篇:第一章 Delphi快速入门(五)