// ####Delphi数组
// ##数组异常
// 数组定义了索引的范围,限定了数组中可能的元素数目以及每个元素的索引值。
// 如果数组索引越界,就会发生异常。
// ##边界检查
// 选中边界检查选项,编译器将向编译后的应用程序添加代码。
// 如果程序存在数组索引越界,
// 如果了Project Options->Compiler->Range Checking,
// 程序在运行时会引发程序在运行时会引发ERangeError 异常;
// 如果没有勾选Range Checking,
// 程序可能会引发EAccessViolation 异常,也可能不出现异常。
var
S : array[1..10] of string;
I : integer;
begin
I := 11;
S[I] := 'Delphi 6 Developer s Guide';
//S[11] := 'Written by Paul Kimmel';
end;
// {$R}编译器指令可以在相关编译器指令之间添加局部的边界检查代码。
// ##定义子界值
// 数组就可以使用诸如字符、布尔值、枚举或整数等类型值进行索引。
type
TIntegerRange = 1..10000;
var
Ints : array[TIntegerRange] of Integer;
// ##使用类型减少边界错误
// 为减少对数组进行索引时的越界错误,
// 可以使用枚举类型、类型别名或新的类型以确保所有的索引都在可接受的范围之内。
Procedure ArrayRange;
type
TEnums = (Enum1, Enum3, Enum4);
TAlias = byte;
TChar = type Char;
var
E : array[TEnums] of string; //枚举
A : array[TAlias] of char; //声明了byte 类型的别名
C : array[TChar] of byte; //使用type newtype = type oldtype 来引入新的、独立的类型。
begin
E[Enum1] := 'An enumerated index.';
A[255] := #65;
C['C'] := 255;
ShowMessage( E[Enum1] );
ShowMessage( A[255] );
ShowMessage( IntToStr(C['C']) );
end;
// 当使用类型别名时,至少可以提高代码的可读性。
// 如果使用引入的新类型,则编译器可以进行一些帮助。
// 对于数组索引,请尽可能使用枚举、类型别名和新的类型,而不要使用内建类型。
// ##下界与上界函数
// 可以使用Low 和High 两个函数,以确保使用数组时索引没有越界。
type
TLimit = 1..100;
var
PreferableStyle : array[TLimit] of integer;
J : TLimit;
begin
for J := Low(TLimit) to High(TLimit) do
PreferableStyle[J] := J;
end;
//事务处理状态
//方式一:
//type
// ProcessState = (psUntreated, psProcessing, psSuspend, psComplete);
//const
// ProcessStateSM: array[ProcessState]of string = ('未处理','处理中','已暂停','已完成');
//方式二:
var //const和var都可以编译通过
ProcessStateSM: array[0..3]of string = ('未处理','处理中','已暂停','已完成');