2014-09-25 26 views
0

我可以得到與RTTI和地址(字段)的字段相同的指針?德爾福 - 獲取與RTTI e地址相同的字段指針

如:

TSomeClass

私人 FSomeField:整數;

...

1)MyPointer =地址(FSomeField)>>從SameField $ 12345

2)RTTI指針>> $ 12345

+0

我不明白。你的代碼是什麼作爲你想要的功能的輸入 – 2014-09-25 20:00:27

+0

我想在某些函數中使用RTTI獲取字段的指針,並在函數外部使用與Addr(字段)相同的指針。 – 2014-09-25 20:03:35

+0

您能否再次閱讀我的評論。也許你可以展示一個我們可以填寫的函數聲明。 – 2014-09-25 20:07:03

回答

2

實際上所有你需要的是讓RTTI場偏移( TRttiField.Offset)並將其添加到初始對象地址(實例地址)。

type 
    TTest = class(TObject) 
     private 
     FInt : integer; 
     FString : string; 
     FBool : boolean; 
    end; 

var t : TTest; 
    ctx : TRttiContext; 
    f : TRttiField; 
begin 

    t := TTest.Create(); 
    try 
     writeln(Format('FInt: %p',[@t.FInt])); 
     writeln(Format('FString: %p', [addr(t.FString)])); 
     writeln(Format('FBool: %p', [@t.FBool])); 

     writeln('--------------'); 
     //field address using rtti 
     ctx := TRttiContext.Create(); 
     try 
      for f in ctx.GetType(t.ClassType).GetFields() do begin 
       writeln(Format('%s: %8x', [f.Name, NativeInt(t) + f.Offset])); 
      end; 
     finally 
      ctx.Free(); 
     end; 

    finally 
     t.Free(); 
    end; 
    readln; 
end.