查看: 16|回复: 0

delphi遍历record

[复制链接]

2

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-7-5
发表于 2022-4-27 10:25:00 | 显示全部楼层 |阅读模式

delphi遍历record

通过rtti遍历record,支持delphi2010以上版本,更低版本不支持。

可以遍历record的field的名称、类型和长度。

 uses system.rtti

type
    Ttest = record
    str: string;
    i32: Integer;
    i64: Int64;
    sgl: Single;
    dbl: Double;
    ext: Extended;
    dt: TDateTime;
    bt: Byte;
  end;
//遍历record

  procedure loopRecord(aTypeInfo, instance: Pointer);
  begin
    var RTX: TRttiContext;
    var RT: TRttiType;
    var RF: TRttiField;
    RT := RTX.GetType(aTypeInfo);
    for RF in RT.AsRecord.GetFields do
      Memo1.Lines.Add(RF.Name + ' ' + RF.GetValue(instance).ToString + ' ' + RF.FieldType.ToString + ' ' + RF.RttiDataSize.ToString);
    RTX.Free;
    RF.Free;
    RT.Free;
  end;
procedure TForm1.button6Click(Sender: TObject);
begin
  var t: Ttest;
  t.str := 'str';
  t.i32 := 32;
  t.i64 := 64;
  t.sgl := 1.1;
  t.dbl := 2.2;
  t.ext := 3.3;
  t.dt := Now;
  t.bt := 1;
  loopRecord(TypeInfo(Ttest), @t);
end;

执行结果

str str string 15
i32 32 Integer 15
i64 64 Int64 15
sgl 1.10000002384186 Single 15
dbl 2.2 Double 15
ext 3.3 Extended 15
dt 2022-05-13 20:01:47 TDateTime 14
bt 1 Byte 14

 

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部