【01】有序类型
有序类型是建立在概念“顺序”或“序列”基础上的数据类型。
你不仅可比较两个有序值的大小,而且可以求取给定有序值的前驱及后继,或者计算它们的最大或最小值。
三种最重要的预定义有序类型是整数类型、布尔类型和字符类型(Integer,Boolean,Char)。
【02】字符类型
Delphi可以使用三种类型的字符变量:
AnsiChar:标准的1字节的ANSI字符。
WideChar:2字节的Unicode字符。Unicode字符集的前256个字符与ANSI字符集相同。
Char:相当于AnsiChar。
字符可用代表它们的符号表示,如'k',也可用数字符号表示,如 #78。
后者还可用Chr函数表示为 Chr(78),用Ord函数可作相反的转换Ord(k)。
#9 跳格 (Tab 键)
#10 换行
#13 回车 (Enter 键)
【03】枚举类型
枚举类型(enumerated)是由一组有序的标识符组成的,说明列出了所有这种类型可以包括的值,如下面的例子。
type Tdays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
可以定义上述枚举类型的变量:
var DayOfWeek:TDays;
序列中每个值都对应一个序号,序号从0开始计数。使用Ord 函数,即可得到一个枚举类型值的序号。例如,Ord (Monday) 返回值1。
【04】子界类型
子界类型(subrange)是下列这些类型中某范围内的值:整型、布尔型、字符型或枚举型。在用户想限制一个变量的取值范围时,子界型是非常有用的。
type
Ten = 1..10;
OverHundred = 100..1000;
Uppercase = 'A'..'Z';
定义子界类型时,你不需要指定基类的名字,而只需提供该类型的两个常数。所用基类必须是有序类型,定义结果将是另一种有序类型。
【05】集合类型
集合类型是一群相同类型元素的组合,集合类型的定义方法:set of <基类型>,例如:
type
TLet = 'A'..'Z';
Letters = set of TLet; //定义集合类型
var
Letters1, Letters2, Letters3: Letters;
begin
Letters1 := ['A', 'B', 'C'];
Letters2 := ['K'];
Letters3 := [];
一个变量通常包含该类型对应的一个值,而集合类型变量可以不包含值、包含一个值、两个值或更多值。集合中元素不能超过256个。
a)关系运算
用in运算符来判断一个给定的元素是否在一个集合中,下面的代码判断在前面所定义的集合T1中是否有200:
if 200 in T1 then
//继续运行
下面的代码判断在TDate中是否没有Mon :
if not (Mon in TDate) then
//继续运行
b)增删元素
用+、-运算符或Include()和Exclude()过程,可以对一个集合变量增删元素:
Include(T1, 256); //在集合中增加256 ;
CharSet : = CharSet + ['d'] ; //在集合中增加'd' ;
Exclude(CharSet, 'a'); //在集合中删除'a' ;
CharSet:=CharSet-['a', ' b']; //在集合中删除'a', ' b' ;
尽可能地用Include()和Exclude()来增删元素,而少用+、-运算符。因为Include()和Exclude()仅需要一条机器指令,而+和-需要多条机器指令。
【06】指针类型
指针类型的变量指向内存空间的地址。定义指针不需用特定的关键字,而用一个特殊字符,这个特殊字符是脱字符号(^),定义形式如下:
type PointerName = ^type;
将@运算符放在变量前面,将获取变量的地址,并可以把地址赋值为同样数据类型的指针。
把^运算符放在一个数据类型的前面,可以定义该类型的一个指针类型;如果放在一个指针的后面,可以获取该指针指向的地址空间的内容。
var
P: ^Integer;
X: Integer;
begin
P := @X;
X := 10;
P^ := 20;
除了表示已分配内存的地址外,指针还能通过New 例程在堆中动态分配内存,不过当你不需要这个指针时,你也必须调用Dispose 例程释放你动态分配的内存。
var
P: ^Integer;
begin
// initialization
New (P);
// operations
P^ := 20;
ShowMessage (IntToStr (P^));
// termination
Dispose (P);
end;
如果指针没有值,你可以把nil赋给它。nil表示空指针。
【07】记录类型
type
Date = record
Year: Integer;
Month: Byte;
Day: Byte;
end;
var
BirthDay: Date;
begin
BirthDay.Year := 1997;
BirthDay.Month := 2;
BirthDay.Day := 14;
【08】数组类型
type
DayTemperatures = array [1..24] of Integer;
在数组定义时,你需要在方括号中填入一个子界类型的值,或者用两个有序类型的常量定义一个新的子界类型,子界类型指定了数组的有效索引。
由于子界类型指定了数组下标值的上界和下界,那么下标就不必象C、C++、JAVA和其他语言那样必须从零开始。
type
DayTemperatures = array [1..24] of Integer;
var
DayTemp1: DayTemperatures;
procedure AssignTemp;
begin
DayTemp1 [1] := 54;
DayTemp1 [2] := 52;
...
DayTemp1 [24] := 66;
DayTemp1 [25] := 67; // compile-time error
数组可以是多维的,如下例:
type
MonthTemps = array [1..24, 1..31] of Integer;
YearTemps = array [1..24, 1..31, Jan..Dec] of Integer;
这两个数组建立在相同的核心类型上,因此你可用前面定义的数据类型声明它们,如下面代码所示:
type
MonthTemps = array [1..31] of DayTemperatures;
YearTemps = array [Jan..Dec] of MonthTemps;
上例的声明把索引的次序前后调换了一下,但仍允许变量之间整块赋值。例如:把一月份的温度值赋给二月份:
var
ThisYear: YearTemps;
begin
...
ThisYear[Feb] := ThisYear[Jan];
使用数组时,你总要用标准函数Low(数组名)和 High(数组名)来返回数组下标的下界和上界。