Delphi Initialize Const Array Of Record



有人知道是否可以初始化记录常量数组吗?

procedure TForm1.Button1Click( Sender: TObject );
type
TMyRec = record
A: Integer;
end;
const
MyArray: TArray< TMyRec > = [ ?, ?, ? ];
begin
end;

谢谢!

每当你有关于Delphi的问题时,你应该首先访问官方文档。

在本例中,结合数组常量和记录常量两节的知识,我们意识到以下语法是有效的:

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'];

从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;

如果你愿意放弃一些类型兼容性,你也可以使用类型推断:

procedure TForm1.FormCreate(Sender: TObject);
begin
const MyArray = [MyRec(1, 5), MyRec(2, 10), MyRec(3, 15)];
end;

相关内容

最新更新