Delphi XE以降の拡張RTTI機能を使用して、オブジェクトをXMLに読み書きしようとしています。これまでは整数、浮動小数点数、文字列、列挙型、集合、クラスで成功しましたが、レコードの出力や読み込みは正しくできません。問題はレコードプロパティにインスタンス(ポインタ)を取得しているようです。Delphi RTTIを使用してレコード値を取得および設定する方法
//Outputs Properties To XML
procedure TMyBase.SaveToXML(node: TJclSimpleXMLElem);
var
child , subchild : TjclSimpleXMLElem ;
FContext : TRttiContext ;
FType : TRttiType ;
FProp : TRttiProperty ;
Value : TValue ;
MyObj : TMyBase ;
FField : TRttiField ;
FRecord : TRttiRecordType ;
Data : TValue ;
begin
FContext := TRttiContext.Create ;
FType := FContext.GetType (self.ClassType) ;
Child := node.Items.Add (ClassName) ;
for FProp in FType.GetProperties do begin
if FProp.IsWritable then begin
case FProp.PropertyType.TypeKind of
tkClass : begin
MyObj := TMyBase (FProp.GetValue (self).AsObject) ;
MyObj.SaveClass (Child.Items.Add (FProp.Name) , FContext) ;
end ;
tkRecord : begin
subchild := Child.Items.Add (FProp.Name) ;
FRecord := FContext.GetType(FProp.GetValue(self).TypeInfo).AsRecord ;
for FField in FRecord.GetFields do begin
>>> self is not the correct instance <<<
Value := FField.GetValue (self) ;
subchild.Items.Add (FField.Name).Value := Value.ToString ;
end;
end ;
else begin
Value := FProp.GetValue(self) ;
Child.Items.Add (FProp.Name).Value := Value.ToString ;
end;
end;
end ;
end ;
FContext.Free ;
end;
値を取得する方法を理解できれば、それらの設定は問題ではないはずです。その後、配列に、ああ男の子!
更新:belowを参照してください。 (視認性を向上させるために個別の回答として移行されました)。
ここで改訂されたコードですか? – GolezTrol
そのXEバージョン – Mitch
"クラス"の代わりに "レコード"を保存する特別な理由はありますか?もしそうでなければ、OmniXMLをチェックすると、TPersistent子孫を* .XMLファイルに/からロードする機能があります。 http://www.omnixml.com/ – ComputerSaysNo