realizar - metodo delphi para un restaurante
Inicialización de matriz Delphi (3)
Las matrices de registros se pueden inicializar en expresiones 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;
En XE7 es posible completar una matriz dinámica de registros como este:
function GetPointArray: TArray<TPoint>;
begin
Result := [Point(1,1),Point(1,2),Point(1,1),Point(1,1)];
end;
Actualmente tengo esto, y apesta:
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;
pero en cambio, quiero hacer algo como esto:
class function rotationTable.offsets(pType, rotState, dir: integer): TpointArray;
begin
Result := [Point(1,1), Point(1,2), Point(1,1), Point(1,1)];
end;
Sin embargo, en la compilación, se queja de que la sintaxis [1, 2, 3, 4] solo puede funcionar para enteros.
¿Hay una manera de instanciar / inicializar una matriz de Tpoint similar a la que quiero?
No puedes porque no puedes expresar en el cuerpo del código un punto en la forma en que puedes expresarlo en la sección const
.
Sin embargo, puedes hacer algunos trucos para que tu vida sea más fácil, especialmente si tienes un número razonable de puntos.
Puede implementar un procedimiento simple como este (código no probado):
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;
... donde TIntegerDynArray es la matriz dinámica de enteros de la RTL. (De hecho funcionará con cualquier array dinámico). Además, TPointArray en el ejemplo anterior también es dinámico.
Entonces, para hacer tu trabajo, puedes hacer esto:
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;
Cosas a tener en cuenta:
- Ves claramente cuales son tus puntos.
- De esta manera puedes ser muy productivo.
- Puedes usar
BlendDimensions
también en otras cosas, no solo en esta. - Puede expandir fácilmente
BlendDimensions
para 3 (o más) dimensiones - ... pero cuidado porque hay una copia involucrada. :-) Con las PC de hoy, el punto débil será, con mucho, tu mano. :-) Te cansarás de escribir mucho más rápido hasta que el tiempo de copia se note.
HTH
La respuesta de Plainth demuestra la sintaxis similar a un constructor para arreglos dinámicos . Puede usar eso directamente en una matriz de TPoint para producir una función auxiliar mucho más simple:
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;
Pero eso es una exageración. Delphi también le permite definir arrays abiertos en línea, y no hay que llamar al constructor adicional para escribir. El resultado utiliza su sintaxis propuesta original, pero con la matriz dentro de una llamada de función. Funcionará en todas las versiones de Delphi, mientras que la sintaxis "Crear" es bastante nueva.
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;
Es posible que desee considerar el uso de la respuesta de Gerry solo para dar nombres significativos a sus matrices de puntos, lo que podría ayudar cuando la depuración y uno de los ocho números mágicos en esas definiciones de puntos es incorrecto.
Finalmente, una nota sobre lo que Delphi quiso decir cuando dijo "la sintaxis [1, 2, 3, 4] solo puede funcionar para enteros". Esa sintaxis define un conjunto , no una matriz. No puede tener un conjunto de valores de registro, pero puede tener un conjunto de valores enteros. Un efecto secundario es que la sintaxis de un conjunto de enteros es la misma que la sintaxis de una matriz abierta de enteros. Creo que Delphi usa el contexto para averiguar a qué te refieres, pero a veces puede adivinar mal.