delphi7学习:数据类型
2021-03-19 08:26
标签:一点 说明 object demo 类类型 判断 动态 不可 short Object Pascal 语言提供了非常丰富的数据类型,即简单类型( Simple)、字符串类型( String)、结 ( 1)简单类型( Simple) Word 0~ 65 535 16 位无符号数 Longword 0~ 4 294 967 295 32 位无符号数 ② 字符类型 字符类型 AnsiChar WideChar Char 注意:因为一个字符在长度上并不表示一个字节,如果程序中必须用到字符的字节数,最好 DayOfWeek=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday); Days=Monday..Friday; 跟枚举类型一样,子界类型是不能直接参加运算的,必须声明一个子界类型的变量。 Set1=set of ’A’.. ’Z’; Set3=set(Jan,Feb,Mar,Apr); //基类型是枚举型 注意: Object Pascal 中不能用>或所以不能用 Ord、 Pred、 Succ 等函数。 ② 数组类型 指针类型 PString, PAnsiString PByteArray PCurrency PExtended POleVariant PShortString PVariant PVarRec RTextBuf PWideString PWordArray ( 5)函数和过程类型( Procedural) delphi7学习:数据类型 标签:一点 说明 object demo 类类型 判断 动态 不可 short 原文地址:https://www.cnblogs.com/huiy/p/12334285.html
构类型( Struct)、指针类型( Pointer)、函数和过程类型( Procedural)和变体类型( Variant)等.
简单类型包括实数类型( 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 位无符号数
字符类型有 3 种字符变量,如表 4-6 所示。
表 4-6 字符类型
取值
备注
8 位
根据扩展 ANSI 字符表排列
16 位
根据 Unicode 码排列,前 256 个 Unicode 字符同 ANSI 字符相同
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 型的子界
注意:声明和使用子界类型时,上界常数和下界常数的类型必须一致,且都是有序类型。子
界型变量所有参加的运算可参照它的宿主类型。子界型变量的取值是有范围的,如果
运算过程中超出这个范围将导致程序出错。
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
Set2=set of Char;
//基类型是子界型
//基类型是字符型
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·
数组类型是某种数据类型的有序组合,其中每一个元素的值由其相对位置来指定,可以在数组的
某个位置上放置数据,并在需要时使用这些数据。下面代码声明了一个 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 语言中的标准指针
所指向变量的类型
AnsiString
ByteArray
Currency
Extended
OleVariant
ShortString
Variant
TVarRec(调用时需引用 System 单元)
TextBuf(调用时需引用 SysUtils 单元)
WideString
TWordArray(调用时需引用 SysUtils 单元)
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 对象。