我是新的相對論delphi並試圖爲我的a2計算課程寫一個複雜的搜索算法。我需要從字符串變量中訪問我的記錄字段。 例如動態記錄訪問
getfield(record,'name');
我發現了一篇文章,可能會解決我的問題,但我無法理解它。請有人把它縮短到我所需要的。謝謝。
http://theroadtodelphi.wordpress.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/
我是新的相對論delphi並試圖爲我的a2計算課程寫一個複雜的搜索算法。我需要從字符串變量中訪問我的記錄字段。 例如動態記錄訪問
getfield(record,'name');
我發現了一篇文章,可能會解決我的問題,但我無法理解它。請有人把它縮短到我所需要的。謝謝。
http://theroadtodelphi.wordpress.com/2010/10/10/fun-with-delphi-rtti-dump-a-trttitype-definition/
從their comment的LU 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.
爲什麼你不先試一試,並問一個問題,如果你卡住了。 –
我已經嘗試了好幾天了,我不能理解它,我真的只是在這裏深入潛水,我需要一個解決方案。 – Lawrence
由於記錄字段是'你的',你可能根本不需要RTTI來訪問它。 RTTI需要在編譯時獲得有關未知類型的信息。 – kludg