How can I set the value?
I tried something like
Test := TTest.Create
Ptr := Pointer(Test);
TSub(Ptr+8) := TSub.Create;
But it is not working?
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
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal