Registriert seit: 23. Jun 2005
403 Beiträge
|
Re: Delphi klasse in xml format exportieren
7. Mär 2007, 17:16
Schau Dir mal die Unit TypInfo an. Da kannst Du auf die RTTI zugreifen, die Delphi auch intern zum streamen von Klassen benutzt. Über die RTTI kannst Du (fast) alle Attributtypen in Strings verwandeln und umgekehrt. Diese musst Du dann nur noch passend aufarbeiten. Hier mal als Anregung ein Stück aus meinem XML-Parser delegaten für mein XML-Interface:
Delphi-Quellcode:
//______________________________________________________________________________
function TXMLStreamDelegate.ReadFromXML(_oParent: IXMLNode): Boolean;
Var
bOwnerHandled: Boolean;
dValue: Extended;
iCount: Integer;
iLoop: Integer;
iValue: Integer;
pInfo: PPropList;
sName: String;
sValue: String;
oNode: IXMLNode;
oObj: TObject;
oXMLStream: IXMLStream;
begin
Result:=True;
iCount:=GetPropList( Owner, pInfo);
For iLoop:=0 To Pred(iCount)
Do Begin
sName:=pInfo[iLoop].Name;
bOwnerHandled:=False;
If Assigned(OnOwnerSreamProperty)
Then Result:=OnOwnerSreamProperty( sName, _oParent, saRead, bOwnerHandled);
If Not bOwnerHandled
And Result
Then Begin
Case pInfo[iLoop].PropType^.Kind Of
tkClass: Begin
oObj:=GetObjectProp( Owner, sName);
If oObj.GetInterface( IXMLStream, oXMLStream)
Then Begin
oNode:=_oParent.ChildNodes.FindNode(sName);
If Assigned(oNode)
Then oXMLStream.ReadFromXML(oNode)
Else Result:=False;
End;
End;
tkInteger,
tkChar,
tkWChar: Begin
Result:=ReadValue( _oParent, sName, iValue);
If Result
Then SetOrdProp( Owner, pInfo[iLoop], iValue);
End;
tkEnumeration: Begin
Result:=ReadValue( _oParent, sName, sValue);
If Result
Then SetEnumProp( Owner, pInfo[iLoop], sValue);
End;
tkSet: Begin
Result:=ReadValue( _oParent, sName, sValue);
If Result
Then SetSetProp( Owner, pInfo[iLoop], sValue);
End;
tkFloat: Begin
Result:=ReadValue( _oParent, sName, dValue);
If Result
Then SetFloatProp( Owner, pInfo[iLoop], dValue);
End;
tkMethod: ;
tkString,
tkLString: Begin
Result:=ReadValue( _oParent, sName, sValue);
If Result
Then SetStrProp( Owner, pInfo[iLoop], sValue);
End;
tkWString: Begin
Result:=ReadValue( _oParent, sName, sValue);
If Result
Then SetWideStrProp( Owner, pInfo[iLoop], sValue);
End;
tkInt64: Begin
Result:=ReadValue( _oParent, sName, iValue);
If Result
Then SetInt64Prop( Owner, pInfo[iLoop], iValue);
End;
Else Begin
raise EPropertyConvertError.CreateResFmt( @SInvalidPropertyType,
[pInfo[iLoop].PropType^.Name]);
End;
end;
End;
If Not Result
Then Break;
End;
If Result
And Assigned(OnOwnerStream)
Then Result:=OnOwnerStream( _oParent, saRead);
end;
In dem Beispiel ist der Delegat ein Member einer beliebiggen TComponent-Klasse die das Interface IXMLStream bereitstellt. Die Events OnOwnerStream und OnOwnerStreamProperty dienen dazu, dass die Owner-Instanz u.U. selber properties schreiben und lesen kann. Alles erklären würde zu weit führen und den ganzen Code will ich eigentlich auch nicht posten aber ich hoffe, ich hab deine Gizmos angeregt.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
|