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 ファイルオブレコードからの情報については、より良いアイデアをいただければ幸いです。