Delphi数组初始化

Delphi数组初始化,delphi,arrays,point,tobject,Delphi,Arrays,Point,Tobject,我现在有这个,很糟糕: type TpointArray = array [0..3] of Tpoint; class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray; begin Result[0] := point(1, 1); Result[1] := point(1, 2); Result[2] := point(1, 1); Result[3] := point(

我现在有这个,很糟糕:

type TpointArray = array [0..3] of Tpoint;

class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin

  Result[0] := point(1, 1);
  Result[1] := point(1, 2);
  Result[2] := point(1, 1);
  Result[3] := point(1, 1);
end;
但是,我想做这样的事情:

class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
   Result := [Point(1,1), Point(1,2), Point(1,1), Point(1,1)];
end;
然而,在编译时,它抱怨[1,2,3,4]语法只能用于整数


有没有一种方法可以像我想要的那样实例化/初始化Tpoint数组?

记录数组可以在常量表达式中初始化:

const
  Points : TPointArray = ((X: 1; Y: 1), (X:1; Y:2), (X:1; Y:1), (X:1; Y:1));

class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
   Result := Points;
end;
在XE7中,可以像这样填充记录的动态数组:

function GetPointArray: TArray<TPoint>;
begin
  Result := [Point(1,1),Point(1,2),Point(1,1),Point(1,1)];
end;
procedure Foo;
var
  myXCoords, myYCoords: TIntegerDynArray; //temp arrays
  myPoints: TPointArray; //this is the real thing

begin
  myXCoords:=TIntegerDynArray.Create( 1, 2, 3, 4, 5, 6, 7, 8, 9,10);
  myYCoords:=TIntegerDynArray.Create(21,32,34,44,55,66,65,77,88,92); //...for example 
  BlendDimensions(myXCoords, myYCoords, myPoints); //build the real thing
 //use it...
end;
函数GetPointArray:TArray;
开始
结果:=[点(1,1),点(1,2),点(1,1),点(1,1)];
结束;

您不能这样做,因为您不能在代码体中表示一个点,而您可以在
const
部分中表示该点

然而,你可以做一些技巧,以使你的生活更轻松,特别是如果你有一个合理的点数

您可以实现这样一个简单的过程(代码未经测试):

注意事项:

  • 你清楚地看到你的观点
  • 通过这种方式,你可以非常富有成效
  • 您还可以在其他方面使用
    BlendDimensions
    ,而不仅仅是在这个方面
  • 您可以轻松展开
    BlendDimensions
    以获得3个(或更多)维度
  • …但要小心,因为涉及到副本。:-)今天的个人电脑,到目前为止,弱点将是你的手。:-)你会累得打字更快,直到复印时间被注意到
HTH

演示了动态数组的构造函数式语法。您可以直接在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版本中工作,而上面的“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;

你可能想考虑只给你的数组点有意义的名字,这可能在调试时帮助,并且这些点定义中的八个魔法数字中的一个是错误的。



最后,请注意Delphi所说的“1,2,3,4]语法只能用于整数”是什么意思。该语法定义了一个集,而不是一个数组。不能有一组记录值,但可以有一组整数。一个副作用是,一组整数的语法与开放整数数组的语法相同。我认为Delphi使用上下文来确定您指的是哪一个,但有时它可能会猜错。

我想知道这个“数组构造函数”是否可以用于“记录数组”这不起作用(E2010-不兼容类型)在D2006中,直到我将常数的定义更改为
Points:TpointArray=…
谢谢@yonojoy-我当时可能正在使用更高版本。还有
而不是
的语法错误添加了一个XE7可能实现的示例,希望可以:-)
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;