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
Result := PointDynArrayTo4PointArray(TPointDynArray.Create(
Point(1,1), Point(1,2), Point(1,1), Point(1,1)));
end;
但那太过繁琐了。Delphi 也允许你在内联方式下定义开放数组,而且不需要编写额外的构造函数调用。结果使用了你最初提出的语法,但将数组包装在函数调用中。它可以在所有 Delphi 版本中使用,而上面的“Create”语法比较新。
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使用上下文来确定你想要哪一个,但有时它会猜错。
Points:TpointArray = ...
,否则会出现“不起作用(E2010-不兼容类型)”的错误。 - yonojoy,
而不是;
而出现了语法错误。 - Gerry Coll