16,748
社区成员
发帖
与我相关
我的任务
分享
type
TXX= packed record
bUpdateUp: Boolean;
end;
TTestAds = packed record
Len1: DWORD;
Len2: DWORD;
Len3: DWORD;
XX: array of TXX;
end;
procedure TForm1.Button3Click(Sender: TObject);
type
TXX = packed record
bUpdateUp: Boolean;
end;
TTestAds = packed record
Len1: DWORD;
Len2: DWORD;
Len3: DWORD;
XX: array of TXX;
end;
var
s1, s2: TTestAds;
FType: TRttiType;
FRecordType: TRttiRecordType;
FField: TRttiField;
FContext: TRttiContext;
Val1, Val2: TValue;
i: Integer;
begin
s1.Len1 := 1;
s1.Len2 := 2;
s1.Len3 := 3;
SetLength(s1.XX, 2);
s1.XX[0].bUpdateUp := True;
s1.XX[1].bUpdateUp := False;
s2.Len1 := 2;
// RTTI反射
// FContext := TRttiContext.Create;
FType := FContext.GetType(TypeInfo(TTestAds));
for FField in FType.GetFields do
begin
Memo1.Lines.Add('FieldType=' + FField.FieldType.ToString); //FieldType=:TTestAds.:1
if FField.FieldType.IsRecord then
begin
// 把这里做成函数递归吧
end;
Val1 := FField.GetValue(@s1);
Val2 := FField.GetValue(@s2);
if Val1.IsArray then
begin
for i := 0 to Val1.GetArrayLength - 1 do
begin
Memo1.Lines.Add(Format('%s[%d] = %s', [FField.Name, i, Val1.GetArrayElement(i).ToString]));
end;
end
else
Memo1.Lines.Add(FField.Name + ' = ' + Val1.ToString);
end;
// FContext.Free;
end;