Am 26.12.2023 um 21:29 schrieb Amir--- via fpc-pascal:

On 12/26/23 01:14, Sven Barth via fpc-pascal wrote:
Amir--- via fpc-pascal <fpc-pascal@lists.freepascal.org> schrieb am Di., 26. Dez. 2023, 07:03:

    Hi,

       I want to retrieve the name of the fields in a record/class,
    at run
    time. It looks like "TVmt.vFieldTable" is what I need. But I
    cannot find
    any documentation about how to explore the content of this table. I
    appreciate any pointer.


This only works for published fields and only fields of type class or interface can be published.
That would work for me. How can I enumerate over those fields?

You can use the PVmtFieldTable and PVmtFieldEntry types from the TypInfo unit:

=== code begin ===

program tfield;

{$mode objfpc}{$H+}

uses
  TypInfo;

type
  {$M+}
  TSub = class

  end;

  TTest = class
  published
    fTest: TSub;
  end;

var
  vft: PVmtFieldTable;
  vfe: PVmtFieldEntry;
  i: SizeInt;
begin
  vft := PVmtFieldTable(PVMT(TTest)^.vFieldTable);
  Writeln(vft^.Count, ' field(s) with ', vft^.ClassTab^.Count, ' type(s)');
  for i := 0 to vft^.Count - 1 do begin
    vfe := vft^.Field[i];
    Writeln(i, ' -> ', vfe^.Name, ' @ ', vfe^.FieldOffset, ' of type ', vft^.ClassTab^.ClassRef[vfe^.TypeIndex - 1]^.ClassName);
  end;
end.

=== code end ===

=== output begin ===

PS C:\fpc\git> .\testoutput\tfield.exe
1 field(s) with 1 type(s)
0 -> fTest @ 8 of type TSub

=== output end ===

Side note: contrary to what I had originally written only classes, but not interfaces are allowed for published fields and they need to have $M enabled.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to