Delphi复习(三)ObjectPascal数据类型下
二:字符串类型String
在OP中,我们通常是使用单引号来括住字符串的,如’Duzhi is a TianCai!‘,注意,非双引号。
Pascal类型有以下几种不同字符串类型(呼,真够复杂的数据类型哦)
AnsiString:这是Pascal默认的字符串类型,它由AnsiChar组成,长度无限制。
ShortString:这是个保留下来的类型,主要是兼容老版本的Delphi,它限制长度为255字符
WideString:这是由WideChar字符组成的,长度无限制。
默认情况下,我们如声明变量为String,则编译器会理解它是AnsiString,我们此时可以使用编译开关来控制它与ShortString之间的转换,若我们$H编译开关为负数,则理解为ShortString类型,默认情况为正,则理解为AnsiString类型,如下面的代码段:
Var
Str1 : string;
{$H-}
Str2 : string;
{$H+}
Str3 : string;
其中Str1,3均为AnsiString类型,而2则为ShortString类型。
但使用$H开关规则的一个例外是,当我们在声明时特别定义了字符串长度,此长度又不超过255字符的话,则又认为是shortString类型,如
Var
Str4 : string[122];
此时Str4默认认为是122字符的一个ShortString字符串。
由于Pascal不支持操作符重载,所以和JAVA一样,对字符串允许直接使用“+”进行连接。
三:结构类型Struct
结构数据类型包括集合,数组,记录,文件,类,类引用,接口等多种类型,OTL折腾人嘛这不是。
1:集合类型Set
集合类型是一群相同类型元素的组合,它要求我们的类型必须是有限的类型,我们看下例子
type
TInt = 0..255;
T1 = set of TInt;
T2 = set of ('a', 'b', 'c');
我们就可以说T1,T2是集合类型的变量。表达式(’a’ in T2)结果为True,而表达式(’x’ in T2)的结果则为False
OP提供了一些用于集合运算的运算符,有利我们进行运算。
集合类型可以进行以下数学运算(设A,B是两个同类型的集合变量):
1)赋值A:=[ ];
2)并A+B,结果是A和B中的所有元素组成的集合;
3)交A*B,结果是A和B中公共元素组成的集合;
4)差A-B,结果是在A中但不在B中的元素组成的集合。
2:数组类型Array
声明格式为:type 标识符=array[下标类型] of 数据类型;
例如,
Var
TArray = array[1..10] of integer;
此时TArray中包含了10个变量,均是整形,其中TArray[1]为其首变量。而非TArray[0]哦。
当然我们也可以分两步进行声明。
type
TArr = array[1..10] of integer;
var
Arr1 :TArr;
此时Arr1就指向了一个含有10个实数型元素的数据序列。
当然我们可以循环为其赋值:
for I:= 1 to 10 do
Arr[I] := 0;
这样就将该数组中的每个元素都赋值为0了。当然可以使用多维数组,例如一个4行4列的数组:
type
TArr2 = array[1..4][1..4] of integer;
我们对它初始化为0的话,可以这么做
Var
Col,Row : Integer;
TArr = array[1..4][1..4] of integer;
begin
for Col := 1 to 4 do
for Row := 1 to 4 do
TArr[Col,Row] := 0,0 ;
3:记录类型Record
之前我们说的数组型,集合型都是类型相同的元素组成的有序结构,在实际问题之中还经常遇到需要不同类型元素组成的结构,记录型可以存放多种不同类型的元素数据。 其声明格式为:
type
标识符=record
域标识符1:类型1;
……
域标识符n:类型n;
end;
例如:
type
TStudent = record
Name : String[20];
YearHired: 1980..1990;
Score : Double;
Fmale : Boolean;
end;
var
StudentA : TStudent;
我们在为其赋值时可以使用下列方法:Students.Score := 89;为单个记录属性赋值。 编写如下的语句的我们可以为整个记录赋值:
with StudentA do
begin
Name := 'duzhi';
YearHird := 1984;
Score := 89;
Fmale := true;
end;
当然,若我们存在StudentB : TStudent,那么我们可以将记录类型的对象做为单一实体进行操作,如
StudentB := StudentA;
4:文件类型 file
我们的记录型record,数组型array,集合型set都是在程序运行期间存储在内存中的数据,而我们有时需要长期保留一些数据,此时我们可以将这些数据存储在外存储器中,这些数据我们称之为文件。而在Pascal语言中的文件型是重要的数据类型之一。 其定义如下
type 标识符 = file of 数据类型
其中文件型的数据类型可以是除文件型外的任何类型。例如
type
IntFile = file of Integer;
然后,我们就能打开一个与这个结构相应的物理文件、向文件中写入整数、或者从文件中读取当前的值。
Pascal 文件类型的使用很直观,而且Delphi 中也定义了一些控件用于文件保存和装载,以及对数据流和数据库的支持。
5:指针类型(无类型/万能类型)
我们访问一个内存变量有两种方法,一是通过其变量名访问,二就是通过它的内存地址进行访问。而指针就是通过地址访问变量的一种数据类型。
指针定义如下:
type 指针标识符 = 类型标识符;
这个指针比较难以解释,某志个人认为和C++中的指针差不多,不过又把指针划分成了各类型的指针罢了,在初级设计中很少用到,所以不再过多说明>_<
烦这东西啊……
6:变体类型Variant
这个是Delphi2.0开始引进的一个功能强大的数据类型,目的是为了支持OLE自动化操作。
它的特点是,在编译期间,其变量类型可以发生动态改变,它可以变成所有的简单的数据类型,甚至是不均匀的数组。正因为它的强大,某志暂时不罗嗦了,等整体复习差不多后再专门花一节进行复习吧,这里大家了解它的用处特点就好。
强制类型转换:
和C++类似咯,但是OP更加严格,它不允许数据长度不同的变量进行强制类型转换,如,我们无法将一个Double类型转换为Int类型的,他们占的字节数是不同的,若一定要强制转换浮点数为整数,可以使用一些函数进行强制转换,单纯的Integer(Double)是不允许的。
下面是一些转换函数的表格说明。
Chr 将一个有序数据转换为一个ANSI字符
Ord 将一个有序类型值转换为它的序号
Round 转换一个实型值为四舍五入后的整型值
Trunc 转换一个实型值为小数截断后的整型值
Int 返回浮点数的整数部分
IntToStr 将数值转换为字符串
IntToHex 将数值转换为十六进制数字符串
StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常
StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值
Val 将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)
Str 将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)
StrPas 将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的
StrPCopy 拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的
StrPLCopy 拷贝Pascal类型字符串的一部分到一个零终止字符串
FloatToDecimal 将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型
FloatToStr 将浮点值转换为缺省格式的字符串
FloatToStrF 将浮点值转换为特定格式的字符串
FloatToText 使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
FloatToTextFmt 同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
StrToFloat 将一个Pascal字符串转换为浮点数
TextToFloat 将一个零终止字符串转换为浮点数