resueltos restaurante realizar para operaciones metodo ingenioempresa ensayo ejemplos como cola coca administracion delphi arrays point tobject

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.