我發現了Delphi的擴展RTTI特性,我認爲這是一個奇怪的疏忽(可能是故意的)。有沒有什麼辦法可以在TRTtiField中的FieldType爲零的結構中獲得real48和shortstring變量的RTTI提示?
我想轉儲一個記錄類型中的所有領域,其中有大約1500個不同的領域。是的,認真。
它們中的一些類型real48的,有些是ShortString短,對於這兩個,看來的FieldType是零這些類型在運行時:
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;
如果我願意承擔所有未繳的字段類型字段實際上是real48的,我可以簡單地使用偏移量和(如果字段寬度是6)獲取real48值。
然而,第二個複雜情況是所有短褲(即string[30]
)類型都受到類似的折磨。
有沒有人得到這兩個古代帕斯卡類型與現代擴展RTTI? 現在我正在使用最好的猜測方法,並且在那裏失敗了,我通過字段的名稱對規則進行了硬編碼,但是如果有一些技術我可以使用,那就可以讓我在那裏不必編寫大量的代碼從我正在更新的所有這些舊的帕斯卡文件中提取信息,我會感激一個更好的主意。
這是一個爲上述字段提供「未知」(錯字)的小單元http://theroadtodelphi.wordpress.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/ – bummi 2013-05-02 15:25:47