Delphi 初始化常量记录数组

Delphi Initialize Const Array Of Record

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

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

end;

谢谢!

每当你有关于Delphi的问题时,官方文档应该是你第一个访问的地方。

在这种情况下,结合Array Constants and 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'];

从 Delphi 10.3 开始,您甚至可以进行 inline 常量声明,在这种情况下,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;