I\'m attempting to use the enhanced RTTI features in Delphi XE or later, to read and write objects to XML. So far I\'ve been successful with integers, floats, strings, enum
Attribution: Originally posted as question's updates by the OP (Mitch ) - Migrated as separate answer to improve visibility.
Barry's solution did the trick. Here's the revised code:
tkRecord : begin
subchild := Child.Items.Add ( FProp.Name ) ;
Value := FProp.GetValue(self) ;
FRecord := FContext.GetType(FProp.GetValue(self).TypeInfo).AsRecord ;
for FField in FRecord.GetFields do begin
Data := FField.GetValue ( Value.GetReferenceToRawData ) ;
subchild.Items.Add ( FField.Name ).Value := Data.ToString ;
end;
end ;
For those that need to deal with arrays:
tkDynArray : begin
Value := FProp.GetValue ( self ) ;
FArray := FContext.GetType(Value.TypeInfo) as TRttiDynamicArrayType ;
subchild := child.Items.Add ( FProp.Name ) ;
cnt := Value.GetArrayLength ;
subchild.Properties.Add ( 'Count' , cnt ) ;
case FArray.ElementType.TypeKind of
tkInteger ,
tkFloat : begin
for a := 0 to cnt-1 do begin
Data := Value.GetArrayElement ( a ) ;
subchild.Items.Add ( IntToStr(a) , Data.ToString ) ;
end;
end ;
tkRecord : begin
FRecord := FArray.ElementType as TRttiRecordType ;
for a := 0 to cnt-1 do begin
Data := Value.GetArrayElement ( a ) ;
subsubchild := subchild.Items.Add ( IntToStr(a) ) ;
for FField in FRecord.GetFields do
SaveField ( subsubchild , FContext , FField , Data.GetReferenceToRawData ) ;
end;
end ;