PDA

Ver la Versión Completa : Como recorrer un record por indice


josepicd
22-12-2015, 14:20:09
Pues eso, quiero saber si es posible y como recorrer una estructura record a traves de un indice o algo asi.

No es este el caso y ya se que esto no es correcto, pero para que podais ver un ejemplo de lo que necesito.



Type
TXtradata = record
version : dword;
revision : dword;
contador : dword;
codusuario : dword;
end;

Var
xtra : TXtradata;

begin
for i := low(TXtradata) to high(TXtradata) do
xtra[i] := 0;
end;


Es decir quiero acceder a los elemento de una estructura sin conocer como esta formada la estrucutra.

Gracias

Caminante
22-12-2015, 14:44:36
Hola

Pues hasta donde se no es posible recorrer asi los campos de un record ya que no es una estructura vectorial. Lo que se me ocurre es crear una clase y simular recorrer como indice los campos

TMiclase=class
private
FCampo1:integer;
FCampo2:string;
//...
//etc
Procedure SetFields(i:integer;Value:variant);
Functon GetFields(i:integer):variant;
public
Property Fields[i:integer]:variant read GetFields write SetFields;
end;

Y en la implementacion devuelves el valor que quieras de acuerdo al indice

Function TMiclase.GetFields(i:integer):variant;
begin
case i of
0:result:=FCampo1;
//...
//los demas campos
end;
end;

Espero sea util

Saludos

AgustinOrtu
22-12-2015, 15:15:34
A partir de Delphi 2010 podes usar RTTI


uses
Rtti;

procedure TForm1.Button1Click(Sender: TObject);
var
Ctx: TRttiContext;
T: TRttiType;
F: TRttiField;
Fields: TArray<TRttiField>;
begin
Memo1.Lines.Clear;
T := Ctx.GetType(TypeInfo(TXtradata));
if not Assigned(T) then
Exit;

Fields := T.GetFields;

Memo1.Lines.Add('Type: ' + T.Name);
for F in Fields do
Memo1.Lines.Add(F.Name);