Object Pascal 语言提供了非常丰富的数据类型,即简单类型( Simple)、字符串类型( String)、结
构类型( Struct)、指针类型( Pointer)、函数和过程类型( Procedural)和变体类型( Variant)等.
( 1)简单类型( Simple)
简单类型包括实数类型( Real)和有序类型( Ordinal)。有序类型又包括整数类型、字符类型、布
尔类型、枚举类型和子界类型等。它们的关系如图 4-1 所示。
图 4-1 简单类型关系图
① 整数类型
整数类型包括的类型,如表 4-5 所示。
表 4-5 整数类型
整数类型 范围 备注
Integer -2 147 483 648~ 2 147 483 647 32 位带符号数
Cardinal 0~ 42 994 967 295 32 位无符号数
Shortint -128~ 127 8 位带符号数
Smallint -32 768~ 32 767 16 位带符号数
Longint -2 147 443 648~ 2 147 483 647 32 位带符号数
Int64 -2~ 2-1 64 位带符号数
Byte 0~ 255 8 位无符号数
Word 0~ 65 535 16 位无符号数
Longword 0~ 4 294 967 295 32 位无符号数
② 字符类型
字符类型有 3 种字符变量,如表 4-6 所示。
表 4-6 字符类型
字符类型
取值
备注
AnsiChar
8 位
根据扩展 ANSI 字符表排列
WideChar
16 位
根据 Unicode 码排列,前 256 个 Unicode 字符同 ANSI 字符相同
Char
Delpi 中通用的字符类型,相当于 WideChar
注意:因为一个字符在长度上并不表示一个字节,如果程序中必须用到字符的字节数,最好
用 SizeOf()函数获取。
③ 布尔类型
布尔类型包括 4 种,分别为 Boolean、 ByteBool、 WordBool 和 LongBool。 Boolean 和 ByteBool 各
占用一个字节, WordBool 占用两个字节, LongBool 占用 4 个字节。
Boolean 的值只能是 0( False)或 1( True), ByteBool、 WordBool 和 LongBool 可以是有符号的整
数,为 0 值代表 False,非 0 值代表 True。
最常用的是 Boolean 类型,而 ByteBool、 WordBool 和 LongBool 类型是为了与其他语言和 Windows
环境兼容,因为 Windows 的 API 在返回一个布尔值时,其值可能是一个两字节的有符号整数。如果试
图把返回值赋给 Boolean 类型的数据,编译器认为类型不匹配,若是进行类型强制转换,可能使返回
值的有效数据被截断。
④ 枚举类型
枚举类型是由一组有序的标识符组成的,它列出了所有这种类型可以包括的值。例如一个星期有
7 天,程序中分别用 0、 1、 2、 3、 4、 5、 6 来表示一个星期的每一天,但在程序中很不直观。下面就
是声明了一个枚举类型的代码:
type
DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);//变量名=(枚举列表)
其中列表中的标识符彼此之间用逗号分隔,它列出了枚举类型所能取值的范围。 Object Pascal 规
定,第 1 个标识符的值为 0,第 2 个标识符的值为 1,依次类推。
为了引用此枚举类型,必须声明一个 DayOfWeek 类型的变量,例如:
var
Days:DayOfWeek;
这样就声明了一个 DayOfWeek 类型的枚举变量 Days, Days 的值总是标识符列表中的一个。
为了简化程序,还可以将类型声明和变量声明合二为一,例如:
var
Days:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
注意:枚举的元素只能是标识符,标识符的命名规则必须符合 Object Pascal 关于标识符的规
定。例如不能以数字打头,标识符不能是保留字,同一个枚举元素不能同时出现在多
个枚举中。
Delphi 7 程序设计与开发技术大全
· 58·
⑤ 子界类型
子界类型是下列类型中某范围内的值,即整型、布尔型、字符型或枚举型。如果需要限制一个变
量的取值范围时,子界类型是一个好的选择。例如:
type
Month=1..12;
Letters=’A’.. ’H’;
DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
//枚举型
Days=Monday..Friday;
//一个 DayOfWeek 型的子界
跟枚举类型一样,子界类型是不能直接参加运算的,必须声明一个子界类型的变量。
注意:声明和使用子界类型时,上界常数和下界常数的类型必须一致,且都是有序类型。子
界型变量所有参加的运算可参照它的宿主类型。子界型变量的取值是有范围的,如果
运算过程中超出这个范围将导致程序出错。
Delphi 的文档中提到,子界类型的上界和下界可以是表达式。
⑥ 实型
实型不是有序类型,因为它的值域是无限的,实型的数据也叫实数,实型用于表示通常所说的浮
点数。 Object Pascal 语言中的实数数据( Real)类型如表 4-7 所示。
表 4-7 实数类型
实数类型 范围 有效位数 字节数
Real48 2.9*10~ 1.7*1011~ 12 6
Single 1.5*10~ 3.4*107~ 8 4
Double 5.0*10~ 1.7*1015~ 16 8
Extended 3.6*10~ 1.1*1019~ 20 10
Comp -2+1~ 2-1 19~ 20 8
Currency -922337203685477.5808~ 922337203685477.5807 19~ 20 8
Real 5.0*10~ 1.7*1015~ 16 8
其中常用的实数类型是 Real、 Single、 Double。
( 2)字符串类型( String)
Object Pascal 的字符串类型分为短字符串和长字符串两种。
短字符串,指字符串长度最大不超过 255 个字符的字符序列。当编译开关的状态为{$H-}时,用
保留字 String 声明的是一个短字符串,不管编译开关$H 处于什么状态下,用 ShortString 声明的变量
总是短字符串类型。代码如下:
var
MyStr1:ShortString;
MyStr2:String[200];
保留字 String 后用方括号括起来的无符号整数,表示字符串的最大长度是 200。当把一个字符串
赋给一个短字符类型的变量时,超过其最大长度的将被截掉。
短字符串中的每一个字符都可以通过字符串名加字符索引来访问。索引是从 0 开始的,但索引 0
处存放的是字符串的实际长度,如下两行代码的功能是一样的,索引 1 处才是真正的字符开始处。
Ord(Str[0]); //Str 代表短字符串
Length(Str);
短字符串的长度是动态改变的,可以使用 Low 和 High 函数取得字符串的最小序号和最大序号,
Low 的返回值是 0, High 的返回值是所声明的字符串的最大长度。
长字符串的长度几乎是无限制的,理论上可以达到 2GB,实际上只会受计算机内存的限制。要声
第 4 章 Object Pascal 语言
· 59·
明一个长字符串,可以用预定义的标识符 AnsiString 或把编译开关$H 改为{$H+}后用保留字 String 声
明。
长字符串在声明以后自动被初始化为空字符串。长字符串中的每个字符,是从索引 1 开始的,长
字符串没有索引 0,要取得长字符串的实际长度,只能调用 Length()函数。
长字符串在它最后一个字符后自动加一个 NULL 字符表示字符串结束( NULL 字符并不是长字符
串的一部分),这一点与字符指针类型( PChar)类似,因此将一个长字符串转换为 PChar 类型很方便,
语法为: PChar(Str),其中 Str 代表长字符串。长字符串被转换为一个指针,指向字符串的每一个字符,
即使长字符串是空的,强制转换后总是能够获得一个指向以 NULL 字符结束的字符中的指针。
Object Pascal 允许字符串和长字符串同时出现在一个表达式中,编译器会自动根据需要进行转换。
注意:字符串变量必须用一对单引号括起来,如果字符串本身就有单引号,这个单引号要用
两个连续的单引号表示,如: ’His name is ’’Jim’’’。
( 3)结构类型( Struct)
结构数据类型包括:集合类型、数组类型、记录类型、文件类型、类类型、类引用类型和接口类
型等。
① 集合类型
集合类型是一群具有相同类型的元素的组合,这些类型必须是有限类型,如整型、布尔型、字符
型、枚举型和子界类型。
集合类型的声明方法,请看以下代码:
type
Set1=set of ’A’.. ’Z’;
Set2=set of Char;
//基类型是子界型
//基类型是字符型
Set3=set(Jan,Feb,Mar,Apr); //基类型是枚举型
Object Pascal 语言提供了几个用于集合的运算符,用这些运行符可以判断集合与集合之间的关系,
例如对集合增删元素,求交集运算等。
赋值运算与简单类型一样,声明了一个集合类型的变量后,要为这个变量设定一个明确的值,例
如:
var
TInt1,Tint2:set of 1..10;
以上代码虽然声明了两个集合变量,但变量 TInt1 和 TInt2 并不是代表 1~ 10 组成的集合,必须对
它们赋值:
TInt1:=[1,3,5,7,9];
TInt2:=[2..5,8..10];
这样 TInt1 就是由 1、 3、 5、 7、 9 组成的集合, TInt2 就是由 2、 3、 4、 5、 8、 9、 10 组成的集合。
关系运算,就是对集合类型的运算,遵循数学中关于集合运算的规则,运算的结果是布尔值。集
合的关系运算就是判断两个集合相互之间的关系,关系运算符包括: =(等于)、 <>(不等于)、 >=(大
于等于)、 <=(小于等于)。
集合 A 等于集合 B,是指两个集合中的元素完全一样(不管元素的排列顺序如何),否则就是不
相等,如下:
[1,2,3,4]=[2,4,1,3]
[1,2,3,4]<>[5,8,9]
如果集合 B 中的元素在集合 A 中都可以找到,那么称集合 A 大于等于集合 B,反之称集合 B 大
于等于集合 A,如下:
[1,2,3,4]>=[1,2,3]
Delphi 7 程序设计与开发技术大全
· 60·
注意: Object Pascal 中不能用>或<对集合类型进行关系运算。因为集合类型不是有序类型,
所以不能用 Ord、 Pred、 Succ 等函数。
② 数组类型
数组类型是某种数据类型的有序组合,其中每一个元素的值由其相对位置来指定,可以在数组的
某个位置上放置数据,并在需要时使用这些数据。下面代码声明了一个 Integer 型的数组变量:
var
TInt:array [1..15] of Integer;
表示 TInt 指向一个含有 15 个 Integer 型元素的数据串列,代表每一个元素的是 1~ 15 之间的数字,
称为索引。数组的每一项由数据组名加“ [ ]”中的索引来表示。 TInt 包含 15 个变量, TInt[1]代表第 1
个变量, TInt[2]代表第 2 个变量,依次类推。
数组也可以用类型定义,代码如下:
type
Int=array [1..15] of Integer;
var
TInt:Int;
可以用下面的方法对数组进行赋值:
for I=0 to 15 do
TInt[I]:=0; //为数组各元素赋初值为 0
数组可以有多维的,定义及赋值方法如下:
type
TArr=array [1..15,1..15] of Integer;
var
Arr:TArr;
C,R:Integer;
……
for C:=1 to 15 do
for R:=1 to 15 do
Arr[C,R]:=0; //为多维数组各元素赋初值为 0
……
③ 记录类型
记录是程序可以成组访问的一群数据的集合。例如下列代码,说明了一个记录类型的定义方法:
type
TStudent=record
ID:Integer;
Name:String[10];
Age:Integer;
Memo:String[100];
end;
记录包含可以保存数据的域,每一个域都有一个数据类型。上面代码中声明的 TStuednt 类型有 4
个域。用下面的方法对记录类型的变量进行声明与使用:
var
Stu:TStudent;
……
with Stu do //以下代码为记录赋值,也可以只给记录的单个域赋值
第 4 章 Object Pascal 语言
· 61·
begin
ID:=1;
Name:= ’Jim’;
Age:=18;
Memo:= ’He is a good student.’;
end;
……
( 4)指针类型(Pointer)
指针是一个表示内存地址的变量。指针类型在任何语言中都比较难理解,也是一种比较灵活的数
据类型。用以下形式定义指针变量:
type
指针类型标识符=^基类型;
下面列举一个对指针操作的例子,代码如下:
program Point; //指针示例工程
{$Apptype console}
type
PInt=^Integer; //定义指针类型
var
I,K:Integer;
PI:Pint; //整形指针
P:Pointer; //无类型指针
begin
I:=3;
K:=5;
PI:=@K; //整形指针指向整形数据
writeln(’K=’,PI^);
P:=@I;
K:=Integer(P^); //无类型指针指向整形数据
writeln(’K=’,K);
PI:=P; //指针之间赋值
writeln(’PI^:’,PI^);
readln;
end.
运行结束,如图 4-2 所示。
图 4-2 指针示例工程显示结果
提示:实例请参见本书配套光盘“ Section4\Pointer\Point.dpr”文件。
Delphi 7 程序设计与开发技术大全
· 62·
“ @”运算符放在变量前面,获取的是变量的地址,并可以将地址赋值为相同数据类型的指针。
把“ ^”运算符放在数据类型的前面,可以定义该类型的一个指针类型;放在一个指针的后面,可以获
得该指针所指地址空间的内容。
例如在“ Point”中,定义了一个可以指向任何数据类型的无类型指针 P,但使用过程中要注意类
型的转换,不可以直接将所指地址中的内容直接赋值给其他类型变量。
Object Pascal 语言中定义了一些标准指针,可以直接调用,如表 4-8 所示。
表 4-8 Object Pascal 语言中的标准指针
指针类型
所指向变量的类型
PString, PAnsiString
AnsiString
PByteArray
ByteArray
PCurrency
Currency
PExtended
Extended
POleVariant
OleVariant
PShortString
ShortString
PVariant
Variant
PVarRec
TVarRec(调用时需引用 System 单元)
RTextBuf
TextBuf(调用时需引用 SysUtils 单元)
PWideString
WideString
PWordArray
TWordArray(调用时需引用 SysUtils 单元)
( 5)函数和过程类型( Procedural)
Delphi 是面向对象和事件驱动的,因此以前那种自上而下的结构化设计方法已经不适合在 Delphi
中编程了。函数和过程是 Pascal 语言的两种子程序,它们可以随时被调用。函数执行时有返回值,而
过程执行时,是没有返回值的。函数的调用是为了得到一个返回值,调用过程仅仅为了执行某种操作。
函数只能出现在表达式中,不能单独使用;过程不能出现在表达式中,仅能以某个语句的形式出现。
① 函数的使用
函数在调用之前必须先声明。函数声明的语法格式如下:
function 函数名(<形式参数表>):<类型>;
begin
<语句>;
<语句>;
...
<语句>;
end;
函数调用的语法格式为:
<函数名>(<实参表>);
注意:实参表中的各个参数必须用逗号分割,其顺序必须和函数说明的顺序相对应,并且个
数相同、类型相符。
下面举一个函数调用的简单例子,在程序中编写一个名为 Total 的自定义函数,主要功能是对传
过来的两个参数进行相加计算,返回计算完毕后的结果。主要代码如下:
program FunctionDemo;
{$APPTYPE CONSOLE}
uses
SysUtils;
第 4 章 Object Pascal 语言
· 63·
//定义函数,用于计算 a、 b 参数的和
function Total(a,b:Integer):Integer;
begin
Total:=a+b;
end;
var
a,b,c:Integer;
begin
try
Writeln(’请输入 a 值’);
Readln(a);
Writeln(’请输入 b 值’);
Readln(b);
c:=Total(a,b); //调用函数
Write(’a 与 b 的和为: ’);
Writeln(c);
Readln;
except
Writeln(’输入的内容不是数字’);
end;
end.
提示:实例请参见本书配套光盘“ Section4\Function\FunctionDemo.dpr”文件。
② 过程的使用
过程与函数类似,在调用之前必须进行声明。过程声明的语法格式如下:
proceduce <过程名>(<形式参数表>)
begin
<语句>
<语句>
...
<语句>
end;
过程调用的语法格式为:
<过程名>(<实参表>)
( 6)变体类型( Variant)
变体类型能够在运行期间动态地改变类型。变体类型能支持所有简单的数据类型,如整型、浮点
型、字符串、布尔型、日期时间、货币及 OLE 自动化对象等。
注意:变体类型不能表达 Object Pascal 对象。