Delphi笔记(整理)-类型

类型可以分为基本(fundamental)和一般(generic)类型。基本类型的范围和形式是相同的,不管是基于何种CPU 和

操作系统;而一般类型的范围和形式是平台相关的
大多数内置类型属于基本类型,但少数整数、字符、字符串和指针类型属于一般类型。
在需要的时候使用一般数据类型是一个好注意,因为它们提供优化的性能和轻便性。
类型也可以分为简单类型、字符串类型、结构类型、指针类型、过程类型和变体类型。

下面的提纲显示了Object Pascal 数据类型的分类:
simple简单类型
ordinal有序类型
integer 一般(generic)整数类型是Integer 和Cardinal
基本整数类型包括Shortint、Smallint、Longint、
Int64、Byte、Word 和Longword
character 基本字符类型是AnsiChar 和WideChar。
一般字符类型是Char,它相当于AnsiChar。
Boolean 布尔类型为Boolean、ByteBool、WordBool和LongBool,Boolean是首选的
enumerated
subrange
real实数类型 Real48 Single Double Extended Comp Currency
string 字符串类型 ShortString AnsiString WideString
structured
set
array
record
file
class
class reference
interface
pointer
procedural
Variant
(type identifier)

标准函数SizeOf 作用于所有变量和类型标志符,它返回一个整数,表明存储指定类型的数据所需要的内存数(字节)。

有序类型包括整数、字符、布尔、枚举和子界类型。有序类型定义一个有次序的数值集合,除了它的第一个值以外,其它每个值都有一个唯一的前驱值(predecessor);除了最后一个外,其它每个值都有一个唯一的后继值(successor)

Ord 有序类型表达式 序数值
Pred 有序类型表达式 表达式的前驱值
Succ 有序类型表达式 表达式的后继值
High 有序类型的变量或标志符 类型的最大值
Low 有序类型的变量或标志符 类型的最小值

例程High、Low、Succ、Pred、Inc、Dec、IntToStr 和IntToHex 完全支持Int64 参数。
而且,Round、Trunc、StrToInt64 和StrToInt64Def 返回Int64 类型的值;
少数例程(包括Ord)根本不能对Int64 数值进行操作。

当把整数类型的最后一个值增大或把第一个值减少时,结果将回到整数类型的开头或尾部

。内置函数Chr,返回一个在AnsiChar 或WideChar取值范围内任意一个整数的字符值。比如,Chr(65)返回字母A。
<Leo>Inc()是什么呢?

对ByteBool、WordBool 和LongBool 来说,若它的序数不为0,它就被认为是True。在一个需要Boolean类型的环境种,

编译器自动把非0 值转换为True。

在Object Pascal 中,布尔表达式不能和整数或实数进行换算。所以,若X 是一个整数变量,语句
if X then ...;
会产生编译错误

定义一个枚举类型,使用下面的语法:
type typeName = (val1, ..., valn)
type Size = (Small = 5, Medium = 10, Large = Small + Medium);
比如:type Suit = (Club, Diamond, Heart, Spade);
在声明变量时,可以直接使用(val1,…,valn)结构,它就像一个类型名称:
var MyCard: (Club, Diamond, Heart, Spade);

子界类型表示其它有序类型(称为基础类型)的一个子集:它的形式为Low..High

• Extended 类型比其它实数类型有更高的精度,但不够轻巧。当使用Extended 类型创建的文件要跨平
台共享时,务必小心。
• Comp(computational)类型对Intel CPU 是优化的,表示为64 位整数,但它被分类位实数类型,因为它的行为不像有序类型(比如,你不能递增和递减)。保留此类型只是为了向后兼容性,使用Int64可获得更好的性能。
• Currency 类型有固定的小数点,可以把在货币运算中出现的错误减到最少。It is stored as a scaled
64-bit integer with the four least significant digits implicitly representing decimal places. 当在赋值

语句和表达式中与其它实数类型混合使用时,它的值会自动除以或乘上10000。

在赋值语句和表达式中,字符串类型可以混合使用,编译器自动进行所需的转换。但对于过程或函数,
当使用引用方式传递字符串时,类型必须正确。

在默认的{$H+}状态下,编译器把string(当它的后面没有包含数字的中括号时)解释为AnsiString;
使用{$H-}指示字把它解释为ShortString。

标准函数Length 返回一个字符串的字符个数;SetLength 设置一个字符串的长度。

可以像数组一样对字符串使用索引。若S 是一个字符串变量,i 是一个整数表达式,则S[i]表示S 中第
i 个字符(或者,严格说来,是第i 个字节)。对于ShortString 或AnsiString,S[i]是AnsiChar 类型;对于
WideString,S[i]是WideChar 类型。语句 MyString[2] := ’A’; 把值A 赋给MyString 的第2 个字符。

若S 是一个ShortString 变量,Ord(S[0]),和Length(S)一样,将返回S 的长度;给S[0]赋值,就像调用SetLength

,将改变S 的长度。

var MyString: string[100];声明一个叫做MyString 的变量,它的最大长度是100 字节,

标准函数High 和Low 能作用于short-string 类型名和变量,High 返回它的最大长度,Low 返回0。

AnsiString 类型又称为长字符串,它可以动态分配,并且长度只受内存限制。它使用8 位ANSI 字符。
长串变量是一个指针,占据4 个字节的内存。当变量为空时(也就是长度为0 的字符串),指针为nil,
此时,它不需要额外的内存

因为长串变量是指针,所以,两个或更多的变量可以引用同一个值,而不必使用额外的内存。编译器利
用这一点节省资源和进行快速赋值。只要一个长串变量被销毁或赋给一个新值,原来的串(变量的前一
个值)引用计数减1,而新的值(如果有的话)引用计数加1。若引用计数为0,它的内存被释放。这个
过程被称为reference-counting。当使用字符串索引改变其中的一个字符时,若字符串的引用计数大于1,
将生成串的一个拷贝,这被称为copy-on-write 机制。

WideString 类型是动态分配的、由16 位Unicode 字符所构成的字符串。在大多数方面,它和AnsiString
相似。(注:宽字符串没有引用计数,不支持copy-on-write 机制,但支持内存动态分配。)
在Win32 下,WideString 和COM BSTR 类型兼容。

Object Pascal 支持单字节和多字节字符以及字符串,适用的类型有:Char、PChar、AnsiChar、PAnsiChar
和AnsiString。对多字节字符串使用索引是不可取的,因为S[i]表示S 中第i 个字节(不一定是第i 个字
符),但是,标准字符串处理函数有多字节版本,它们还实现了locale-specific ordering for characters(多
字节函数的名称通常以Ansi 开头,比如StrPos 的多字节版本是AnsiStrPos)。多字节支持依赖于操作系
统和本地设置(current locale)。
Object Pascal 使用WideChar、PWideChar 和WideString 类型支持Unicode 字符和字符串。

字符串常量和类型PChar、PWideChar 是赋值兼容的,后两者表示指针,
它们指向一个以0 结尾的Char 或WideChar 字符数组。

一个字符指针(PChar 或PWideChar)可以像数组一样使用索引。

结构类型包括集合、数组、记录,也包括类、类引用(class-reference)和接口类型。
除了集合只能包含有序值以外,结构类型可以包含其它的结构类型,且结构的层次不受限制。
默认情况下,一个结构类型的值被圆整为字(word)或者双字(double-word),这样访问起来更迅速。
当声明一个结构类型时,可以包含关键字packed,这将对数据的存储进行压缩(并不是压缩,只是不再
圆整数据,而保留它的自然结构)。比如:
type TNumbers = packed array[1..100] of Real;
使用packed 使数据访问变慢,并且在使用字符数组的情况下,能影响类型兼容性

集合(Set)是同一种有序类型的值的聚集,它们包含的值没有内在的顺序,且一个值在集合中包含两次并没有
实际意义。声明:
type
TSomeInts = 1..250;
TIntSet = set of TSomeInts;
?等同於:type TIntSet = set of 1..250;
有了上面的声明,你就可以像下面这样构造集合了:
var Set1, Set2: TIntSet;
...
Set1 := [1, 3, 5, 7, 9];
Set2 := [2, 4, 6, 8, 10]
你也可以直接使用set of …构造直接声明变量:
var MySet: set of ’a’..’z’;
...
MySet := [’a’,’b’,’c’];

静态数组类型以下面的格式声明:array[indexType1, ..., indexTypen] of baseType
比如:var MyArray: array[1..100] of Char;

一个多维数组是数组的数组,比如:
type TMatrix = array[1..10] of array[1..50] of Real;
就等价于
type TMatrix = array[1..10, 1..50] of Real;
可使用这样的索引:MyMatrix[2,45],或像这样:MyMatrix[2][45]。

packed array[Boolean,1..10,TShoeSize] of Integer; 等价于
packed array[Boolean] of packed array[1..10] of packed array[TShoeSize] of Integer;

标准函数Low 和High 作用于数组类型(的标志符)或变量,它们返回数组第1 个索引(类型)的最小
值和最大值;Length 返回数组第1 维的元素个数

一维、压缩的(packed)、Char 类型的静态数组称为packed string,它和字符串类型兼容,也和其它具有
相同元素个数的packed string 兼容。

array[0..x] of Char 类型的数组,是0 下标开始的字符数组,它用来存储零结尾字符串,并且和PChar 类
型兼容。

??????值或把它??SetLength函??,它的?存被重新分配。
动态数组以下面的形式声明: array of baseType
比如:var MyFlexibleArray: array of Real;

要取消动态数组的分配,给它的变量赋值nil,或者把变量传给Finalize
不要对一个动态数组变量使用运算符‘^’,也不要对它使用New 或Dispose 过程

若X 和Y 是同一类型的动态数组变量,X := Y 使X 指向和Y 相同的数组(在这个操作之前,不必给X
分配内存)。不像字符串和静态数组,动态数组不会在被写之前自动拷贝。

使用索引给动态数组赋值(比如,MyFlexibleArray[2] := 7),不会为数组重新分配内存;编译时,索引
边界检查也不会给出提示。

要截断一个动态数组,把它传给SetLength 或Copy,并把返回的值赋给数组变量(SetLength 通常更快)

记录(类似于其它语言中的结构)表示不同种类的元素的集合,每个元素称为“字段”,声明记录类型时
要为每个字段指定名称和类型。声明记录的语法是
type recordTypeName = record
fieldList1: type1;
...
fieldListn: typen;
end
比如:
type
TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;
只有在实例化时才进行分配,像下面的样子:
var Record1, Record2: TDateRec;
Record2 := Record1; 把Record1 的值拷贝给Record2
也可以使用record ...构造直接声明变量:
var S: record
Name: string;
Age: Integer;
end;

一个记录类型能拥有变体部分,它看起来就像case 语句
type
TEmployee = record
FirstName, LastName: string[40];
BirthDate: TDate;
case Salaried: Boolean of
True: (AnnualSalary: Currency);
False: (HourlyWage: Currency);
end;

要声明一个文件类型,使用下面的语法:type fileTypeName = file of type

展开阅读全文

没有更多推荐了,返回首页