2013-05-02 43 views
4

我發現了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? 現在我正在使用最好的猜測方法,並且在那裏失敗了,我通過字段的名稱對規則進行了硬編碼,但是如果有一些技術我可以使用,那就可以讓我在那裏不必編寫大量的代碼從我正在更新的所有這些舊的帕斯卡文件中提取信息,我會感激一個更好的主意。

+0

這是一個爲上述字段提供「未知」(錯字)的小單元http://theroadtodelphi.wordpress.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/ – bummi 2013-05-02 15:25:47

回答

4

不幸的是,Real48沒有任何類型的信息。

你可以看到,當您嘗試編譯此:

program Project1; 

begin 
    TypeInfo(Real48); 
end. 

這同樣適用於字符串[n]的語法。但是,你也許可以定義自己的字符串類型,如修復:

type 
    string30 = string[30]; 

這本身將不包括備案領域的RTTI,所以你需要破解/修復RTTI我這裏顯示:https://stackoverflow.com/a/12687747/587106

相關問題