标签:
这里简单的描述Object的语法中的基本内容,数据类型。因为代码是自描述的所以不废话,直接贴代码。
{ 用户自定义类型 1、数组 2、动态数组 3、记录 4、集合 } program UserDefine; {$APPTYPE CONSOLE} uses SysUtils; { 记录 1、记录相当于C语言中的结构体 2、记录类型通过 type 和 record 关键字来定义 3、记录类型要在使用前定义,通常放在 var 定义之前说 4、可以定义可变记录类型,可变记录类型就和C语言中的unio类型类似 } //定义一个记录类型 type person = record name:string; id :integer; end; { 定义可变记录类型 1、注意定义可变记录的关键字 record 2、case 注意定义的形式和语法, 其中,case后面没有配对的关键字 } TvariantRecord = record nullStr:pchar; intField:integer; case integer of 0:(D:double); 1:(I:integer); 2:(C:char); end; { 集合 1、集合就是和代数中的集合一样理解, 有点类似于C/C++中的枚举 2、集合可以进行求交集、并集等操作 3、集合的定义通过 set 来实现 4、集合最大只能容纳 256 各元素 5、集合只能用在序数类型定义,字符串、实数等不能定义 } TCharSet = set of ansichar; TWeekSet = set of 0..7 ; //定义星期的集合 //TSingleset = set of single; 这个定义要注意 var { 数组 1、数组的下标可以不必从默认的 0 开始,可以从其他数值开始 2、通过 Low 和 High 函数可以求出不从0开始的数组下标的下界和上界 3、多维数组的定义通过逗号在数组定义的 [一维长度,二维长度,...] } //定义一个数组数组相当于C语言中的 int nArray[8] //下表从 0 开始,到7 结束 nArray:array[0..7] of integer; //定义一个数组 相当于C语言中的 char chArray[8] //下表从 1 开始,到 8 结束 chArray:array[1..8] of ansichar; //定义一个3元素的数组 fArray:array[10..12] of real; //定义一个多维数组 nMatrix:array[1..2,1..2] of integer; { 动态数组 1、动态数组是在编译期间不能确定维数的数组,需要在运行时确定维数的数组 2、动态数组在使用前必须先分配内存空间 3、注意在两个不同行定义的动态数组的类型不一样,如下所示 4、多维动态数组 } nDynamicArray:array of integer; //下面两个动态数组类型一样 nA1,nA2:array of integer; { 下面两个动态数组类型不一样 nA1:array of integer nA2:array of inter } nA3,nA4:array of integer; nA5:array of array of integer; nA6:array of array of integer; //定义一个record类型变量,注意这里不需要关键字record p1:person; p2:person; p3:person; { 可变记录 1、可变记录的声明和定义与其他变量的定义一样 } variRecord:TvariantRecord; { 集合变量 1、集合的定义与其他数据类型一致 2、集合变量的赋值和初始化必须使用 [ ], 集合成员之间用逗号隔开 } charSet:TCharSet = [‘a‘,‘b‘]; charSet_1 : TCharSet = [‘b‘,‘c‘,‘d‘]; weekSet:TWeekSet = [0]; begin //引用 nArray[0]:= 10; { 引用chArray[0] 错误,因为下标从1开始 chArray[0] := ‘a‘; } //通过函数 Low 和 High 返回下界和上界 nArray[1]:=Low(fArray); //注意数组的上界 nArray[7]:=High(fArray); //访问二维数组中的元素,注意Delphi中多维数组访问元素的与C语言中的差别 nMatrix[1,1] := 1; nMatrix[1,2] := 2; nMatrix[2,1] := 3; nMatrix[2,2] := 4; { 访问动态数组 1、首先必须申请内存 2、然后就可以和静态数组一样访问,此时的数组下标从0开始,需要注意 3、动态数组是生存期管理类型,即超过生存期后,就由系统自动回收 4、可以通过将动态数组赋值为 nil 就可以提前回收内存。 5、动态数组时引用类型,有点类似于ansistring } SetLength(nDynamicArray,30); nDynamicArray[0]:= 10; writeln(Low(nDynamicArray)); Writeln(High(nDynamicArray)); //手动回收内存 nDynamicArray := nil; //nDynamicArray[0]:= 10; //因为访问错误的内存,因此会提前退出程序运行 SetLength(nA1,2); nA2 := nA1; nA1[0] := 10; nA2[0] := 23; //因为nA2是nA1的引用,所以 nA1[0] 也等于23 writeln(nA1[0]); { 1、注意下面的一段代码与前面代码的区别,上面 nA1与nA2引用同一段内存 2、下面nA3和nA4指向不同的代码。 } SetLength(nA3,2); nA3[0] := 14; nA4 := copy(nA3); nA4[0] := 15; writeln(nA3[0]); { 多维动态数组 1、多维动态数组和一维动态数组一样,使用之前被必须申请空间,赋值和copy也会 分配空间。 2、多维动态数组可以分多次给各维申请空间 } //单次分配一维的空间 setlength(nA5,1); //单次分配全部两维的空间 setlength(nA6,1,1); //访问记录变量 p1.name := ‘volacanol‘; p1.id := 512; //记录的直接赋值 p2 := p1; //通过with语句赋值记录的成员 with p3 do begin name := ‘cnblogs‘; id := 100; end; // 引用可变记录 variRecord.nullStr := ‘This is null string field.‘; variRecord.intField := 10; // 下面是可变记录的可变域,是double类型 variRecord.D := 10.0 ; writeln(variRecord.D); // 下面是可变记录的可变域,是integer类型 variRecord.I := 5; writeln(variRecord.I); // 下面是可变记录的可变域,是char 类型 varirecord.C := ‘a‘; writeln(variRecord.c); // 用 with 语句来初始化可变记录的域,这个与 with variRecord do begin nullStr :=‘This is null string field.‘; intField := 19; d := 13.0 ; i := 6 ; c := ‘b‘; end; writeln(variRecord.D); // 输出为13.0 为巧合 writeln(variRecord.I); // 输出为 98 是因为 b ascii 码值 == 98 writeln(variRecord.c); // 最后输出为 b 才是正确的 { 集合的操作 1、判断元素是否在集合里面, 通过关键字 in 来实现 2、集合的并集 3、集合的交集 4、往集合中增加元素 5、从集合中删除元素 } //判断元素是否在集合里面 if ‘a‘ in charSet then begin writeln(‘a is in charSet‘); end; // 集合的并集 if ‘b‘ in (charSet + charSet_1 ) then begin writeln(‘b is in charSet + charSet_1‘); end; // 集合的交集 if ‘d‘ in (charSet * charSet_1 ) then begin writeln(‘d is in charSet * charSet_1‘); end; //通过 Include 和 Exclude 函数或者 + - 运算符增删结合中的元素 //注意集合元素必须用 [ ] charSet := charSet + [‘y‘]; if ‘y‘ in charSet then begin writeln(‘y is in charSet.‘); end; // 通过 Include 函数增加集合元素, 注意 include 函数中集合元素 // 不需要 [ ] 来表示。 Include(charSet,‘x‘); if ‘x‘ in charSet then begin writeln(‘x is in charSet.‘); end; //通过Exclude删除集合元素 Exclude(charSet,‘x‘); if not (‘x‘ in charSet) then begin writeln(‘after exclude x is not in charSet‘); end; readln; end.
欢迎转载,转载请注明来源。
Delphi_04_Delphi_Object_Pascal_基本语法_02
标签:
原文地址:http://www.cnblogs.com/volcanol/p/5324449.html