Ale*_*x O 18 arrays delphi 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(1, 1);
end;
Run Code Online (Sandbox Code Playgroud)
但相反,我想做这样的事情:
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
Result := [Point(1,1), Point(1,2), Point(1,1), Point(1,1)];
end;
Run Code Online (Sandbox Code Playgroud)
但是,在编译时,它抱怨[1,2,3,4]语法只适用于整数.
有没有办法实例化/初始化一个Tpoint数组,类似于我想要的方式?
Ger*_*oll 25
记录数组可以在const表达式中初始化:
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;
Run Code Online (Sandbox Code Playgroud)
在XE7中,可以填充动态的记录数组,如下所示:
function GetPointArray: TArray<TPoint>;
begin
Result := [Point(1,1),Point(1,2),Point(1,1),Point(1,1)];
end;
Run Code Online (Sandbox Code Playgroud)
Rob*_*edy 10
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;
Run Code Online (Sandbox Code Playgroud)
但这太过分了.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;
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑使用Gerry的答案,只是为了给点数组提供有意义的名称,这在调试时可能会有所帮助,并且这些点定义中的八个幻数之一是错误的.
最后,说明Delphi在说"[1,2,3,4]语法只能用于整数时"的含义.该语法定义了一个集合,而不是一个数组.您不能拥有一组记录值,但可以拥有一组整数.副作用是一组整数的语法与打开的整数数组的语法相同.我认为Delphi使用上下文来确定你的意思,但它有时会猜错.
你不能,因为你无法在代码主体中以在节中表达它的方式表达它const
。
但是,您可以采取一些技巧来让您的生活更轻松,尤其是当您拥有合理数量的分数时。
您可以实现像这样的简单过程(代码未测试):
procedure BlendDimensions(aXArray, aYArray: TIntegerDynArray; var aResult: TPointArray);
var
nCount: integer;
i: integer;
begin
nCount:=High(aXArray);
if nCount <> High(aYArray) then
Exception.Create('The two dimension arrays must have the same number of elements!');
SetLength(aResult, nCount);
for i:=0 to nCount do
begin
aResult[i].X:=aXArray[i]; //simple copy
aResult[i].y:=aYArray[i];
end;
end;
Run Code Online (Sandbox Code Playgroud)
...其中 TIntegerDynArray 是 RTL 的动态整数数组。(事实上,它适用于任何动态数组)。另外,上例中的 TPointArray 也是动态的。
因此,为了完成你的工作,你可以这样做:
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;
Run Code Online (Sandbox Code Playgroud)
注意事项:
BlendDimensions
不仅可以用在这个上,还可以用在其他东西上BlendDimensions
到 3 个(或更多)维度华泰