网上的关于Delphi的文章很少,我在学习了Delphi的过程中将自己的一些思考总结下来,方便后面学习Delphi或者相关内容时方便学习使用Delphi。
目录
静态数组的定义方法
声明数组需要通过保留字 array 和 of 进行声明:
//1. 标准方法:
var
MyArr: array[0..10] of Integer; //定义静态数组
//2. 可以使用非0下标:
var
MyArr: array[9..10] of Integer; //不能提倡,这样不容易与系统函数沟通
//3. 根据预定义类型来声明数组:
type
TMyArr = array[0..10] of Integer; //先定义一个数组类型
var
MyArr: TMyArr; //再定义静态数组
//4. 在非过程区可以直接赋值:
var
MyArr: array[0..2] of Integer = (11,22,33);
//5. 多维数组:
var
MyArr: array[0..2, 0..2] of Integer;
begin
//使用
MyArr[1,2] := 100;
end;
//6. 根据子界定义数组:
type
TRange = 0..10;
var
MyArr: array[TRange] of Integer;
使用类型定义:
//7. 根据枚举定义数组:
type
TEnums = (Enum1,Enum2,Enum3);
var
MyArr: array[TEnums] of string;
begin
MyArr[Enum1] := '十月';
ShowMessage(MyArr[Enum1]); //十月
end;
//8. 根据其他类型定义数组:
var
MyArr: array[Byte] of Char;
begin
MyArr[255] := #65;
ShowMessage(MyArr[255]); //A
end;
//应尽量不使用内建类型,可以新建类型:
type
TNewByte = Byte;
var
MyArr: array[TNewByte] of Char;
begin
MyArr[255] := #65;
ShowMessage(MyArr[255]); //A
end;
//也可以使用类型别名:
type
TChar = type Char;
var
MyArr: array[TChar] of Byte;
begin
MyArr['C'] := 255;
ShowMessage(IntToStr(MyArr['C'])); //255
end;
定义记录类型数组:
//同时定义类型:
type
MyRec = record
s: string;
r: Real;
b: Byte;
end;
var
Arr1: array[0..100] of MyRec;
Arr2: array[0..100] of record s: string; r: Real; b: Byte; end; //可以直接这样定义
Arr3: packed array[0..100] of MyRec; //压缩数组定义, 好像没有区别
动态数组的使用
动态数组的定义:
在后面定义的时候再写确定的大小。
//例1:
var
StrArr: array of String; //动态数组定义时不写维数
begin
SetLength(StrArr,6); //分配6个元素位置大小: 0-5
StrArr[0] := '十七画生'; //动态数组的下界是 0
ShowMessage(StrArr[0]); //分配空间后和静态数组一样使用
StrArr := nil; //一般没必要手动释放, 动态数组离开作用域会自释放
end;
动态数组的引用:
这里是同一个数组,只不过可以由两个指针指向引用。
var
Arr1,Arr2: array of Integer;
a: array[0..1] of Integer;
begin
SetLength(Arr1,6);
Arr1[5] := 100;
Arr2 := Arr1; //Arr2 引用了 Arr1
ShowMessage(IntToStr(Arr2[5])); //100
ShowMessage(IntToStr(Length(Arr2))); //当然 Arr2 维数也会是 6
ShowMessage(IntToStr(SizeOf(Arr1))); //4, 其实动态数组是个指针
ShowMessage(IntToStr(SizeOf(Arr2))); //4
Arr2[5] := 99; //现在它们指向同一个数组, 改变这个就是改变那个
ShowMessage(IntToStr(Arr1[5])); //99
Arr1 := nil; //释放其中一个指针, 数组继续存在(空间还在,指针可以多对一)
ShowMessage(IntToStr(Arr2[5])); //99
end;
动态多维数组:
只是简单的添加了一个array。
var
Arr: array of array of Integer; //定义多维数组
begin
SetLength(Arr,5,5); //分配空间
Arr[0,3] := 100; //赋值
ShowMessage(IntToStr(Arr[0,3])); //取值
end;
数组copy
全部复制:
这里与Delphi的数组引用有区别,区别实际上在于这里另外开辟了一块空间,里面内容一模一样。
var
Arr1,Arr2: array of Integer;
begin
SetLength(Arr1,6);
Arr1[5] := 100;
Arr2 := Copy(Arr1); //数组 Copy
Arr2[5] := 99; //改变 Arr2 不再影响 Arr1
ShowMessage(IntToStr(Arr1[5]-Arr2[5])); //1
SetLength(Arr1,7);
ShowMessage(IntToStr(Length(Arr1))); //7
ShowMessage(IntToStr(Length(Arr2))); //6, 没有一点牵扯了
end;
切片范围复制:
这里可以控制复制的范围,可以分块复制,但是不能间隔几个元素复制。
代码如下:
var
Arr1,Arr2: array of Integer;
i: Integer;
begin
SetLength(Arr1,6);
for i := Low(Arr1) to High(Arr1) do //给每个元素赋值
Arr1[i] := i+1;
Arr2 := Copy(Arr1,1,3); //只 Copy 第2..4个元素
ShowMessage(IntToStr(Arr1[1])); //2, 现在 Arr2[0] 和 Arr1[1] 的值是一样的
ShowMessage(IntToStr(Arr2[0])); //2
ShowMessage(IntToStr(Length(Arr1))); //6, 维数肯定不一样了
ShowMessage(IntToStr(Length(Arr2))); //3
end;
运行结果展示:
检测数组的上、下界
当系统函数low,high的参数是数组变量时,两函数分别返回数组下标的下界和上界。
代码如下:
var
Myarray: array of integer;
i : Integer;
begin
SetLength(MyArray,10);
for i:=Low(MyArray[i]) to High(MyArray[i]) do
……
end;