Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Pointer auf IXMLDOMElement (https://www.delphipraxis.net/84905-pointer-auf-ixmldomelement.html)

F.W. 23. Jan 2007 14:50


Pointer auf IXMLDOMElement
 
Hallo DPler!

Ich habe jetzt schon überall im Internet und hier gesucht, doch nirgends etwas gefunden (ausgenommen EINEN Treffer in einem kostenpflichtigen Forum :( ) Ich bin auch fast überzeugt, dass ich etwas übersehen haben muss. Denn es kommt mir komisch vor, dass ich der erste sein soll, der danach fragt...

Ich liste alle Knoten aus einer XML-Datei in einem TTreeView auf. Jedoch hat jeder XML-Knoten noch mehrere Properties, die ich gern anzeigen lassen möchte, wenn man auf der/das? entsprechende Node im TreeView klickt.
Damit ich einen Bezug zwischen den zweien herstellen kann, habe ich nun versucht einen Pointer auf den XML-Knoten im TreeNode.Data zu speichern.
Aber das funzt nicht richtig (hatte auch schon Probleme zu dem Pointer zu kommen, da es mit dem @-Operator ja nicht funktioniert)
Delphi-Quellcode:
var
 TreeNode: TTreeNode;
 xmlNode: IXMLDOMElement;

   {  Einlesen in TreeView }

 for I := 0 to xmlNode.childNodes.length-1 do begin
        TreeNode := Tree.Items.AddChild(NIL, (xmlNode.childNodes[I] as IXMLDOMElement).getAttribute(AttrName));
        TreeNode.Data := Pointer(xmlNode.childNodes[I]);

   {  Auslesen aus TreeView }

 xmlNode := IXMLDOMElement(Node.Data);

sakura 23. Jan 2007 14:57

Re: Pointer auf IXMLDOMElement
 
Geht auch nicht direkt. Aber nutze einen Wrapper, das ist relativ einfach.
Delphi-Quellcode:
type
  TNodeData = class
  private
    FXMLNode: IXMLDOMNode;
  public
    constructor Create(aXMLNode:IXMLDOMNode);
    property XMLNode: IXMLDOMNode read FXMLNode;
  end;

....

var
TreeNode: TTreeNode;
xmlNode: IXMLDOMElement;

   {  Einlesen in TreeView } 

for I := 0 to xmlNode.childNodes.length-1 do begin
        TreeNode := Tree.Items.AddChild(NIL, (xmlNode.childNodes[I] as IXMLDOMElement).getAttribute(AttrName));
        TreeNode.Data := TNodeData.Create(xmlNode.childNodes[I]);

   {  Auslesen aus TreeView } 

xmlNode := TNodeData(Node.Data).XMLNode;
Aber nicht vergessen die Klasse später wieder freizugeben ;)

...:cat:...

F.W. 23. Jan 2007 15:09

Re: Pointer auf IXMLDOMElement
 
Danke sakura!! :-) Es funktioniert endlich :party:

Noch eine Frage zum Wiederfreigeben: Wie gestalte ich das bei einem TreeView am elegantesten wenn ich den ganzen bzw. Teile davon löschen möchte?
Muss ich mir da extra was Rekursives basteln oder gibts da schon vorgefertigte Sachen von der VCL?

sakura 23. Jan 2007 15:22

Re: Pointer auf IXMLDOMElement
 
Zitat:

Zitat von F.W.
Muss ich mir da extra was Rekursives basteln oder gibts da schon vorgefertigte Sachen von der VCL?

Einfach die ausgewählte Node aus dem TreeView löschen. Dabei auch die entsprechende Node aus dem XMLDOM löschen. Der Rest geschieht von allein.

Für das Löschen von TreeNodes gibt es imo auch ein Event im Objektinspektor, so dass Du dann die entsprechenden Objekte aus dem Data-Pointer jeweils freigeben kannst ;)

...:cat:...

F.W. 23. Jan 2007 15:28

Re: Pointer auf IXMLDOMElement
 
Zitat:

Zitat von sakura
Für das Löschen von TreeNodes gibt es imo auch ein Event im Objektinspektor, so dass Du dann die entsprechenden Objekte aus dem Data-Pointer jeweils freigeben kannst ;)

Stimmt, hab das Ereignis OnDeletion gefunden. Das ist mir um einiges lieber als extra rekursiv durchzugehen

Nochmal danke, jetzt kann ich endlich weitercoden :)

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz