Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como recorrer un record por indice (https://www.clubdelphi.com/foros/showthread.php?t=89599)

josepicd 22-12-2015 14:20:09

Como recorrer un record por indice
 
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.


Código Delphi [-]
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

Código Delphi [-]
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

Código Delphi [-]
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

Código Delphi [-]
uses
  Rtti;

procedure TForm1.Button1Click(Sender: TObject);
var
  Ctx: TRttiContext;
  T: TRttiType;
  F: TRttiField;
  Fields: TArray;
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);


La franja horaria es GMT +2. Ahora son las 09:06:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi