2011-03-05 51 views
3
type 
myrec = record 
id:dWord; 
name:array[0..31] of WideChar; 
three:dword; 
count:dword; 
ShuXing:Single; 
ShuXing2:dword; 
ShuXing3:dWORD; 

    end; 

var 
    Form1: TForm1; 
    mystr:TMemoryStream; 
    nowmyrec:myrec; 

implementation 
USES Rtti; 
{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 


var 
    rttiContext: TRttiContext; 
    rttiType: TRttiType; 
    fields: TArray<TRttiField>; 
    item: myrec; 
    i:word; 
begin 
mystr:=TMemoryStream.Create; 
mystr.LoadFromFile(ExtractFilePath(Application.exename)+'1.data'); 
mystr.Position:=20; 
mystr.readbuffer(nowmyRec,88); 




rttiType := rttiContext.GetType(TypeInfo(myRec)); 
    fields := rttiType.GetFields; 
    for i := low(fields) to high(fields) do 
    begin 
Memo1.Lines.Add(fields[i].GetValue(@nowmyRec).ToString); 


    end; 

end; 

end. 

myrec.name是中文字符,myrec.name的長度是64字節,我無法讀取myrec.name備忘錄,請幫助我!delphi2010遍歷rtti的記錄

回答

2

我在德爾福2010年,我發現你的代碼有幾個問題。首先,我無法讓RTTI方法使用字符數組的內聯聲明。我把它改爲:

type 
    TCharArray = array[0..31] of WideChar; 
    TRec = record 
    id:dWord; 
    name:TCharArray; 
    end; 

如果聲明數組內聯,你做的方式,在調用GetValue引發AV。這可能是在XE中修復的,或者很可能我錯誤地使用了RTTI。

其次,你需要數組特殊處理,而不是標量值:

procedure Main; 
var 
    i, j: Integer; 
    rec: TRec; 
    rttiContext: TRttiContext; 
    rttiType: TRttiType; 
    fields: TArray<TRttiField>; 
    val: TValue; 
    s: string; 
begin 
    rec.id := 1; 
    rec.name := 'Hello Stack Overflow'; 

    rttiType := rttiContext.GetType(TypeInfo(TRec)); 
    fields := rttiType.GetFields; 
    for i := low(fields) to high(fields) do begin 
    val := fields[i].GetValue(@rec); 
    if val.IsArray then begin 
     s := ''; 
     for j := 0 to val.GetArrayLength-1 do begin 
     s := s+val.GetArrayElement(j).ToString; 
     end; 
     Writeln(s); 
    end else begin 
     Writeln(val.ToString); 
    end; 
    end; 
end; 

輸出:

1 
Hello Stack Overflow 

這顯然不是生產代碼,但它至少應該讓你回來在路上!

P.S.這是我第一次看到新的RTTI功能。它看起來非常漂亮!

+0

我正在閱讀一個十六進制 – babaloveyou 2011-03-05 12:08:31

+0

我在閱讀十六進制數據,它必須使用tstream! 「rec.name:='你好堆棧溢出':不能適合我 – babaloveyou 2011-03-05 12:13:52

+0

它*是*漂亮;-) – 2011-03-05 12:40:24