4

Delphi の拡張 RTTI 機能の奇妙な見落とし (おそらく意図的) と思われるものを発見しました。

約 1500 の異なるフィールドを持つレコード タイプのすべてのフィールドをダンプしたいと考えています。はい、真剣に。

一部は real48 型で、一部は shortstring 型です。これら 2 つの場合、実行時にこれらの型の FieldType は nil のように見えます。

function TRttiField.GetValue(Instance: Pointer): TValue; 
var
  ft: TRttiType;
begin
  ft := FieldType;
  if ft = nil then
    raise InsufficientRtti; // This fires!
  TValue.Make(PByte(Instance) + Offset, ft.Handle, Result);
end;

すべての nil-fieldtype フィールドが実際には real48 のものであると想定したい場合は、単純にオフセットを使用して (フィールド幅が 6 の場合) real48 値を取得できます。

ただし、2 つ目の複雑な点は、すべての shortstring (つまりstring[30]) 型が同様に影響を受けることです。

これら 2 つの古代の Pascal 型を最新の拡張 RTTI で使用できるようにした人はいますか? 現在、私は最善の推測によるアプローチを使用しており、それが失敗した場合は、フィールドの名前でルールをハードコーディングしていますが、抽出するために多くのコードを書かなくても、そこに到達できるテクニックがあれば使用できます。私が近代化しようとしているこれらすべての古い Pascal ファイルオブレコードからの情報については、より良いアイデアをいただければ幸いです。

4

1 に答える 1