2013-02-01 101 views
0

我是新的相對論delphi並試圖爲我的a2計算課程寫一個複雜的搜索算法。我需要從字符串變量中訪問我的記錄字段。 例如動態記錄訪問

  getfield(record,'name'); 

我發現了一篇文章,可能會解決我的問題,但我無法理解它。請有人把它縮短到我所需要的。謝謝。

http://theroadtodelphi.wordpress.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/

+3

爲什麼你不先試一試,並問一個問題,如果你卡住了。 –

+0

我已經嘗試了好幾天了,我不能理解它,我真的只是在這裏深入潛水,我需要一個解決方案。 – Lawrence

+0

由於記錄字段是'你的',你可能根本不需要RTTI來訪問它。 RTTI需要在編譯時獲得有關未知類型的信息。 – kludg

回答

6

their commentLU RD的碼A死簡單適應。這個編譯和在Delphi XE2下工作,但早期版本也應該沒問題。

program Project4; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils, RTTI, TypInfo; 

type 
    TSampleRecord = record 
    SomeInt: Integer; 
    SomeStr: String; 
    SomeFloat: Single; 
    end; 

function GetField(Rec: TValue; const FieldName: String): String; 
var 
    Context: TRTTIContext; 
    RTTIRecord: TRTTIRecordType; 
    RecField: TRTTIField; 
    RecValue: TValue; 
begin 
    if (Rec.Kind = tkRecord) then 
    begin 
    RTTIRecord := Context.GetType(Rec.TypeInfo).AsRecord; 
    RecField := RTTIRecord.GetField(FieldName); 

    RecValue := RecField.GetValue(Rec.GetReferenceToRawData); 
    Result := RecValue.ToString(); 

    if (RecValue.Kind = tkFloat) then 
     Result := Format('%.4f', [RecValue.AsExtended]); 
    end; 
end; 

var 
    SR: TSampleRecord; 
begin 
    SR.SomeInt := 1992; 
    SR.SomeStr := 'Lorem ipsum dolor sit amet'; 
    SR.SomeFloat := 3.1415; 

    Writeln(GetField(TValue.From(SR), 'SomeInt')); 
    Writeln(GetField(TValue.From(SR), 'SomeStr')); 
    Writeln(GetField(TValue.From(SR), 'SomeFloat')); 

    Readln; 
end. 
+0

非常感謝這真是太好了。 – Lawrence

+0

我很高興能夠提供幫助。您可以輕鬆擴展此功能以支持更復雜的記錄字段。 :)看看我在這裏使用的參考資料,你應該能夠在瞬間找出它。 – Pateman