tutorial tag manager google español delphi delphi-xe2

delphi - tag - Pase el parámetro de registro sin declararlo primero como una variable



google tag manager español (4)

Si estoy tratando de llamar a un procedimiento que tiene un tipo de registro (no un objeto) como parámetro, ¿es posible pasar de algún modo los detalles de ese parámetro "en línea" sin tener que declarar primero una variable de ese tipo?

Por ejemplo, supongamos que tengo este tipo de registro simple:

type TMyRecord = record AString: string; AnInt: Integer; end;

y esta declaración de procedimiento:

procedure MyProcedure(Rec: TMyRecord);

Si quiero llamar a MiProcedimiento, ¿tengo que declarar una variable de tipo TMyRecord o puedo hacer algo como:

MyProcedure(TMyRecord("Test", 10));

Eso no funciona (XE2) (recibe un error del compilador al respecto esperando un ")").

Entonces, ¿puedo hacer algo así? O no es posible.

Gracias


¡Sería bueno! Pero no.

Si pasar los objetos en línea es realmente su objetivo, entonces tal vez le convengan los Parámetros de matriz abierta.

Procedure MyProcedure(const Vars: Array of Variant); begin ShowMessage(VarToStr(Vars[0])+'' ''+VarToStr(Vars[1])); end; procedure TForm1.Button1Click(Sender: TObject); begin MyProcedure([''Test'', 12]); end;

También puede pasar una matriz de Const, que es básicamente una matriz de TVarRec que es un registro de variante que también incluye información de tipo como VType. Esto es algo divertido ...

Un excelente artículo se puede encontrar en Rudy''s Delphi Corner aquí: Rudy''s Delphi Corner, Parámetros de matriz abierta


Es posible utilizar la estructura de advanced record .

Para obtener más información sobre advanced records , consulte la sección Registros (avanzados) en la ayuda de Delphi.

Este es un pequeño prototipo para ver cómo funciona en su caso para preinicializar un registro en una llamada de función / procedimiento:

Type TRecord = record AString : String; AnInt : Integer; Constructor Create( Const s : String; i : Integer); end; constructor TRecord.Create(const s: String; i: Integer); begin AString := s; AnInt := i; end; procedure DoSomething( theRec : TRecord); begin WriteLn(theRec.AString, '' '',theRec.AnInt); end; begin DoSomeThing( TRecord.Create(''S'',1)); ReadLn; end.

En cuanto a Delphi RTL, vea las definiciones de los tipos de registro TPoint y TRect en unit system.types (XE2). Definen algunos constructores de Create sobrecargados, que se utilizan en muchos lugares para preinicializar las estructuras de registro en llamadas de función / procedimiento.


La pregunta que hace está relacionada con la legibilidad del código y existe una solución que evita tener que crear una variable. La VCL usa esta solución con los registros TPoint y TRect .

Considere la definición de TPoint :

type TPoint = record X,Y integer end;

Para pasar un TPoint a un procedimiento que podría hacer:

var MyPoint : TPoint; begin MyPoint.X := 5; MyPoint.Y := 7; DoSomething( MyPoint ); end;

Esto está bien pero toma 3 líneas cuando también es posible usar una función de fábrica Point :

begin DoSomething( Point(5,7) ); end;

En Delphi, una función ha sido declarada como sigue:

function Point( X, Y : integer ) : TPoint; begin Result.X := X; Result.Y := Y; end;

Luego, puede llamar a esta función ''en línea'' para crear el registro ''sobre la marcha'' para ver rápidamente. Se proporcionará lo mismo para TRect etc. A menudo pongo tal función de fábrica junto con la declaración de registro de la siguiente manera, incluso si No planeo usarlos todavía:

type TMyRecord = record A : integer; B : string; end; function MyRecord( A : integer; const B : string ) : TMyRecord; begin Result.A := A; Result.B := B; end;

El uso de esta técnica puede mejorar la legibilidad del código y también garantiza que no omita la configuración de un elemento de registro.


Simplemente divirtiéndose con la idea de John Easley:

type TRec = record X: string; Y: Integer; end; procedure TestRec(const Rec: array of const); var R: TRec; begin R.X:= string(Rec[0].VUnicodeString); R.Y:= Rec[1].VInteger; ShowMessage(R.X + IntToStr(R.Y)); end; procedure TForm1.Button7Click(Sender: TObject); begin TestRec([''Test'', 22]); end;

Es posible pasar campos de registro como una array of const parámetros array of const y asignar estos parámetros a la variable de registro local.