Plainth 的回答演示了动态数组的类似构造函数的语法。您可以直接在 TPoint 数组上使用它来生成更简单的辅助函数:
type
TPointDynArray = array of TPoint;
T4PointArray = array[0..3] of TPoint;
function PointDynArrayTo4PointArray(const input: TPointDynArray): T4PointArray;
var
i: Integer;
begin
Assert(Length(input) = Length(Result));
for i := 0 to High(input) do
Result[i] := input[i];
end;
class function rotationTable.offsets(pType, rotState, dir: integer): T4PointArray;
begin
// New dynamic-array-constructor syntax here
Result := PointDynArrayTo4PointArray(TPointDynArray.Create(
Point(1,1), Point(1,2), Point(1,1), Point(1,1)));
end;
但这太过分了。Delphi 还允许您内联定义开放数组,并且无需编写额外的构造函数调用。结果使用您最初建议的语法,但数组包含在函数调用中。它适用于所有 Delphi 版本,而上面的“创建”语法是相当新的。
function PointOpenArrayTo4PointArray(const input: array of TPoint): T4PointArray;
var
i: Integer;
begin
Assert(Length(input) = Length(Result));
for i := 0 to High(input) do
Result[i] := input[i];
end;
class function rotationTable.offsets(pType, rotState, dir: integer): T4PointArray;
begin
Result := PointOpenArrayTo4PointArray(
[Point(1,1), Point(1,2), Point(1,1), Point(1,1)]);
end;
您可能想考虑使用Gerry 的答案只是为您的点数组提供有意义的名称,这在调试时可能会有所帮助,并且这些点定义中的八个幻数之一是错误的。
最后,关于 Delphi 所说的“[1, 2, 3, 4] 语法只能用于整数”的注释。该语法定义了一个集合,而不是一个数组。你不能有一组记录值,但你可以有一组整数。副作用是一组整数的语法与开放整数数组的语法相同。我认为 Delphi 使用上下文来确定您的意思,但它有时会猜错。