Einzelnen Beitrag anzeigen

Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#3

Re: Delphi klasse in xml format exportieren

  Alt 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>
  Mit Zitat antworten Zitat