gpt4 book ai didi

delphi2010 rtti的遍历记录

转载 作者:行者123 更新时间:2023-12-03 15:57:28 31 4
gpt4 key购买 nike

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进行备忘录,请帮助我!!!

最佳答案

我使用的是 Delphi 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

这显然不是生产代码,但它至少应该让您重新上路!

附注这是我第一次了解新的 RTTI 功能。看起来很漂亮!

关于delphi2010 rtti的遍历记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5202489/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com