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.