Delphi初始化Const记录数组
有谁知道是否可以初始化记录常量数组?
procedure TForm1.Button1Click( Sender: TObject );
type
TMyRec = record
A: Integer;
end;
const
MyArray: TArray< TMyRec > = [ ?, ?, ? ];
begin
end;
谢谢!
回答
每次遇到关于Delphi的问题,应该首先访问官方文档。
在这种情况下,结合Array Constants和Record Constants部分的知识,我们意识到以下语法是有效的:
type
TMyRec = record
A, B: Integer;
end;
const
MyArray: array[0..2] of TMyRec =
(
(A: 1; B: 5),
(A: 2; B: 10),
(A: 3; B: 15)
);
最初,问题谈到了静态数组,但它的建议TArray<TMyRec>实际上是一个动态数组。根据定义,TArray<T> = array of T。
从 Delphi XE7 开始,您可以创建动态数组类型常量,只要元素的类型足够简单:
const
A: TArray<Integer> = [11, 22, 33];
S: TArray<string> = ['alpha', 'beta', 'gamma'];
const
A: TArray<Integer> = [11, 22, 33];
S: TArray<string> = ['alpha', 'beta', 'gamma'];
从 Delphi 10.3 开始,您甚至可以进行内联常量声明,在这种情况下,RHS 甚至可以依赖运行时函数。但是这些与“真正的”常量相去甚远。将它们视为只读(或分配一次)变量:
因此,如果您创建一个创建记录的函数(可能是一个记录构造函数),您可以使用内联常量声明来创建这样一个记录的常量动态数组:
begin
const MyArray: TArray<TPoint> = [Point(1, 5), Point(2, 10), Point(3, 15)];
如果你愿意放弃一些类型兼容性,你也可以使用类型推断:
type
TMyRec = record
A, B: Integer;
end;
function MyRec(A, B: Integer): TMyRec;
begin
Result.A := A;
Result.B := B;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
const MyArray: TArray<TMyRec> = [MyRec(1, 5), MyRec(2, 10), MyRec(3, 15)];
end;