0

私がやろうとしているのは、インスタンスなしでクラスのフィールドのリストを取得することです...例:

TAClass=class

a_: Integer;
b_: Integer;

constructor (a,b Integer);

end;

VMT から fieldTable を取得できません。

ovmt: PVmt;
ftable: PVmtFieldTable;
finfo: PVmtFieldEntry;

ovmt:=PVmt(TAClass);
ftable := ovmt^.vfieldtable
finfo := ftable^.fields[0]

この方法では、フィールドのリストを取得していません

どんな助けでも大歓迎です、事前に感謝します

4

1 に答える 1

0

Afaik 従来の Delphi と FPC のフィールド テーブルは、公開されたフィールドに対してのみ機能します。パブリッシュされたフィールドはクラス フィールドである必要があります (整数などの値の型はプロパティを介して指定する必要があります)。新しい Delphi では、公開されていないフィールドの RTTI も許可されていますが、動作が異なり (untis が異なります)、FPC はまだサポートしていません。

typinfo のヘルプは例が少ないように見えるので、小さなデモンストレーションの例をハックしました。tpersistent の派生に注意してください。

{$mode delphi}

uses typinfo,classes;
type
  TAClass=class(Tpersistent)
                   a: tstringlist;
                   b: tlist;
                 end;


 var
      ovmt: PVmt;
      FieldTable: PVMTFieldTable;
      PVMTFieldEntry;
           i: longint;

    begin

         ovmt := PVmt(TAClass);
         while ovmt <> nil do
         begin
           FieldTable := PVMTFieldTable(ovmt^.vFieldTable);
           if FieldTable <> nil then
           begin
             FieldInfo := @FieldTable^.Fields[0];
             for i := 0 to FieldTable^.Count - 1 do
             begin
               writeln(fieldinfo^.name);
               FieldInfo := PvmtFieldEntry(PByte(@FieldInfo^.Name) + 1 + Length(FieldInfo^.Name));
             end;
           end;
           { Try again with the parent class type }
           ovmt:=ovmt^.vParent;
         end;

終わり。

于 2014-10-26T11:05:59.217 に答える