Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.109 Beiträge
 
Delphi 12 Athens
 
#250

AW: himXML (gesprochen himix ML)

  Alt 10. Okt 2010, 20:48
@geskill: kommst auch gleich dran

@Medium:
die 1 vor die 3 verschieben
Delphi-Quellcode:
n := XML.RootNode.Nodes['#Element>ID=1'];
f := XML.RootNode.Nodes['#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f, True);
oder die 1 ausschneiden und vor der 3 wieder einfügen
Delphi-Quellcode:
n := XML.RootNode.Nodes.Remove('#Element>ID=1');
f := XML.RootNode.Nodes['#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f, True);
Ich würde aber Ersteres bevorzugen, denn falls was beim Einfügen schief geht (Exception), dann würde f wild in der Gegend rumliegen (Speicherleck).

bzw, die 1 hinter die 3 verschieben
Delphi-Quellcode:
n := XML.RootNode.Nodes['#Element>ID=1'];
f := XML.RootNode.Nodes['#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f);
oder die 1 ausschneiden und nach der 3 wieder einfügen
Delphi-Quellcode:
n := XML.RootNode.Nodes.Remove('#Element>ID=1');
f := XML.RootNode.Nodes['#Element>ID=3'];
XML.RootNode.Nodes.Insert(n, f);

Nun aber noch 2 kleine Fehlerkorrekturen:
- In TXMLNodeList.Remove das "not" entfernen
- und nach dem Insert waren wirklich ein paar Zeiger fehlerhaft
Delphi-Quellcode:
    Function TXMLNodeList.Insert(Node, RNode: TXMLNode; previousR: Boolean = False): TXMLNode;
      Begin
        If not (Node is TXMLNode) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SInvalidNode);
        If (Assigned(_Parent) and (_Parent.InnerText <> '')) or (Assigned(_FirstNode)
            and ((_FirstNode.NodeType = xtCData) or (Node.NodeType = xtCData))) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SIsTextNode, _Parent.Name);
        If Assigned(RNode) and (not (RNode is TXMLNode) or (RNode.ParentList <> Self)) Then
          Raise EXMLException.Create(ClassType, 'Insert', @SNodeNotInList);
        If Assigned(Node.ParentList) Then Node := Node.ParentList.Remove(Node);
        Inc(_NodesCount);
        If previousR Then Begin
          If not Assigned(RNode) Then RNode := _FirstNode;

          If not Assigned(_FirstNode) or (_FirstNode = RNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerPrev) Then RNode.InnerPrev.InnerNext := Node;
            Node.InnerPrev := RNode.InnerPrev;
            Node.InnerNext := RNode;
            RNode.InnerPrev := Node;
          End;
        End Else Begin
          If not Assigned(RNode) Then RNode := _LastNode;

          If not Assigned(_FirstNode) Then _FirstNode := Node;
          If not Assigned(_LastNode) or (_FirstNode = RNode) Then _LastNode := Node;
          If Assigned(RNode) Then Begin
            If Assigned(RNode.InnerNext) Then RNode.InnerNext.InnerPrev := Node;
            Node.InnerNext := RNode.InnerNext;
            Node.InnerPrev := RNode;
            RNode.InnerNext := Node;
          End;
        End;
        Node.CheckCrypted(True);
        Result := Node;
        DoNodeChange(Result, xcAddetNode);
      End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (10. Okt 2010 um 20:51 Uhr)
  Mit Zitat antworten Zitat