![]() |
Treeview mit XML füllen
So, habe im Titel genanntes versucht. Habe mir auch einige Threads hier durchgelesen aber das nicht richtig verstanden, bzw konnte die Beispiele nicht ausführen.
Habe versucht das ganze rekursiv auszuführen und folgenden Code bekommen.
Delphi-Quellcode:
Ich gehe also immer wieder die Länge der NodeList durch, die ich aus dem XML Dokument habe. Dann füge ich jeweils ein Item als Child des gewählten Items des Treeviews hinzu, prüfe ob noch ChildNodes in der NodeList vorhanden sind und wenn, dann setze ich das neu hinzugefügte TreeViewItem selected und rufe die Prozedur nochmal mit den ChildNodes der NodeList aus.
procedure TForm1.UpdateTree(Nodes: IXMLDOMNodeList);
var i: Integer; aTree: TTreeNode; begin for i := 0 to Nodes.length - 1 do begin DialogTree.Items.AddChild(DialogTree.Selected, Nodes.item[i].nodeValue); if Nodes.item[i].childNodes.length > 0 then begin DialogTree.Selected := DialogTree.Selected.Item[0]; UpdateTree(Nodes.item[i].childNodes); end; end; end; procedure TForm1.GetDialog(DialogName: String); var i, j: Integer; NodeList: IXMLDOMNodeList; TreeNode: TTreeNode; begin DialogTree.Items.Clear; Nodelist := xmlDoc.documentElement.selectNodes(DialogName); DialogTree.Items.BeginUpdate; DialogTree.Items.AddFirst(nil, DialogName); DialogTree.Selected := DialogTree.TopItem; UpdateTree(Nodelist); DialogTree.Items.EndUpdate; end; Mist das is schwer zu erklären, ich hoffe ihr versteht was ihc meine. Es klappt aber nicht. Er fügt die Items wild durcheinander hinzu. Das ist meine XML-Datei: Zitat:
Weiss wer wo der Fehler liegt? Wie mach ichs besser? Danke schonmal! ;-) |
Re: Treeview mit XML füllen
Hallo,
Leider weiß ich nicht woher man das IXMLDOMNodeList-Objekt bekommt, kann also auch deinen Source bei mir nicht ausprobieren. Aber mal so aus der Hüfte geschossen ...
Delphi-Quellcode:
Ohne Garantie! Wie gesagt, ich kenne IXMLDOMNodeList nicht.
procedure TForm1.UpdateTree(Nodes: IXMLDOMNodeList; ParentNode : TTreeNode);
var i: Integer; aTree, NewParent : TTreeNode; begin for i := 0 to Nodes.length - 1 do begin aTree := DialogTree.Items.AddChild(ParentNode , Nodes.item[i].nodeValue); if Nodes.item[i].childNodes.length > 0 then begin NewParent := aTree; UpdateTree(Nodes.item[i].childNodes, NewParent); end; end; end; |
Re: Treeview mit XML füllen
Probier ich heute Nachmittag, vielen Dank ;-)
Das Objekt gibts auf der Microsoft HP, XML4.0 |
Re: Treeview mit XML füllen
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, es klappt noch nicht ganz wie ich es möchte. Das hier ist meine XML-Datei:
Zitat:
Delphi-Quellcode:
So, ich denke ihr seht wo das Problem ist. Die ganzen Sachen werden alle verdoppelt, dadurch dasss sie nochmal als SubNode angezeigt werden. Außerdem wird nicht nur der Text des aktuellen Nodes, sondern auch der aller Subnodes hinzugefügt.
procedure TForm1.UpdateTree(Nodes: IXMLDOMNodeList; ParentNode: TTreeNode);
var i, j: Integer; aTree, NewParent: TTreeNode; subNode: IXMLDOMNode; begin for i := 0 to Nodes.length - 1 do begin subNode := Nodes.item[i]; aTree := DialogTree.Items.AddChild(ParentNode, subNode.Text); //Präfixe hinzufügen aTree.ImageIndex := 0; for j := 1 to high(PRAEFIXE) do if subNode.nodeName = PRAEFIXE[j] then aTree.ImageIndex := j; if subNode.nodeName = 'collection' then aTree.Text := 'Collection' else if subNode.nodeName = 'ende' then aTree.Text := 'Ende'; //Präfixe Ende if subNode.childNodes.length > 0 then begin NewParent := aTree; UpdateTree(subNode.childNodes, NewParent); end; end; end; Wie lässt sich das verhindern? Stehe da etwas auf dem Schlauch :-\ |
Re: Treeview mit XML füllen
Ich hab das nun hinbekommen. Aber nun habe ich das Problem, dass ich aus dem TreeView wieder direkt auf die XML Nodes zu greifen möchte. Dazu speicher ich in der Data Eigenschaft der TTreeNodes einen Pointer zu den IXMLDOMNodes. Ich kann hinterher aber nicht wieder darauf zugreifen!?
Hier mal ein Codeschnipsel:
Delphi-Quellcode:
Ich krich immer ne AccessViolation, bei der letzen Zeile! (Dass die hier keinen Sinn macht ist klar, ist nur zum Zweck des Zeigens.
PIXMLDOMNode: ^IXMLDOMNode;
var i, j: Integer; aTree, NewParent: TTreeNode; subNode, aNode: IXMLDOMNode; begin for i := 0 to Nodes.length - 1 do begin subNode := Nodes.item[i]; aTree := DialogTree.Items.AddChildObject(ParentNode, '', PIXMLDOMNode(subNode)); aNode := IXMLDOMNode(DialogTree.Items[i].Data); Folgendes funktioniert aber:
Delphi-Quellcode:
Was mache ich falsch? Kann mir bitte wer dabei helfen? Ich verzweifele ^^
var
i, j: Integer; aTree, NewParent: TTreeNode; subNode, aNode: IXMLDOMNode; begin for i := 0 to Nodes.length - 1 do begin subNode := Nodes.item[i]; aTree := DialogTree.Items.AddChildObject(ParentNode, '', PIXMLDOMNode(subNode)); aNode := IXMLDOMNode(aTree.Data); |
Re: Treeview mit XML füllen
Bitte, kann mir niemand helfen? :(
|
Re: Treeview mit XML füllen
Huhu, das mit den Nodezeiger speichern ist eine gute Idee.
Du kannst dir das im Video zum 2. Stammtisch anschauen wie das geht. Ich meine ich hätte ihr auch schon mal eine Lösung gezeigt (Objekte im Tree) Pseudocode:
Delphi-Quellcode:
auf das ^ achten!
vst.nodedatasize:=sizeof(IXMLDOMNode);
var node: pvirtualnode; xmlobj: IXMLDOMNode; [...] node:=vst.addchild(nil, xmlobj); xmlobj:=IXMLDOMNode(vst.getnodedata(node)^); |
Re: Treeview mit XML füllen
Ok, vst ist ein TTreeNode?
Aber was für ein Video meinst du denn?!? o.O Danke schonmal! Probiere das nacher mal! |
Re: Treeview mit XML füllen
Ups, du nutzt das native Control TTreeview.
Meine Antwort bezieht sich auf den VirtualStringTree (VST) von Mike Lischke. Kostenlos und Opensource ![]() Vom native Control habe ich keine Ahnung. Diese Videos: ![]() |
Re: Treeview mit XML füllen
Hm schade, danke trotzdem! Kann wer anders dann weiterhelfen? ^^
|
Re: Treeview mit XML füllen
das objekt TTreeNode hat doch eine data eigenschaft, nutz diese doch.
das interface vom xmlobjekt ist eh ein zeiger, den bekommst du dort rein. ggf. typcasten
Delphi-Quellcode:
node.data = pointer(xmlnode);
xmlnode:=IXMLDOMNode(node.data); |
Re: Treeview mit XML füllen
Genau so hab ichs doch gemacht. Aber wenn ich dann was an xmlnode ändere, dann krieg ich ne access violation...
|
Re: Treeview mit XML füllen
Liste der Anhänge anzeigen (Anzahl: 1)
ok, dann macht dir das com schwierigkeiten...
hab ein beispiel dran gehängt. es fehlt dir eine referenz! mein code ist umsauber beim beenden, jeder knoten muss noch wieder die referenz freigegen. |
Re: Treeview mit XML füllen
Seh ich mir an, danke!
|
Re: Treeview mit XML füllen
Ok, soweit alles verstanden. Vielen Dank! Nur was macht folgende Zeile?
Delphi-Quellcode:
Werde das wenn ich wieder Zeit finde versuchen für mich zu übernehmen und sehen ob weiterhin Fehler auftreten. Hoffe nicht ;-)
e._AddRef();
Soweit schonmal DANKE DANKE DANKE :) Edit: Ok, kurz angetestet, nur wenn ich das AddRef hinzufüge, wird keine Access Violation ausgegeben, ohne schon. Also, wo liegt das Geheimnis dieser Zeile? :) ^^ |
Re: Treeview mit XML füllen
Das Com zählt wieviele Zeiger auf ein Objekt sind, sind keine Zeiger mehr auf einem Objekt wird dieses Objekt freigegeben.
Delphi versucht das automatisch, mit dem Typcast auf Pointer geht das automatische verloren. Das ComObj wird freigegeben und dein TTreenodezeiger zeigt ins leere mit dem Ergebnis Schutzverletzung. Mit addref wird der Zeigerzähler (richtig: Referenzzähler) erhöht - ergo das Obj wird nicht freigegeben. Wenn du dann den Treenode löscht muss! du allerdings den Zähler auch wieder manuell runterzählen. Sonst wird das ComObj nie freigegeben. |
Re: Treeview mit XML füllen
Âchso, dh wenn ich
Delphi-Quellcode:
Aufrufe, wird sozusagen xyz genillt, wenn xyz nur einen Zeigerzähler hat? Gut zu wissen xD Aber warum? Ist das nicht total unsinnig? ^^
Pointer(xyz);
Danke soweit! Ich denke mal manuell runterzählen tue ich mit etwas wie xyz._RemoveRef oder so oder? Wenn es so eindeutig is find ich das dann raus denke ich mal.. ;-) Dankeschöööööön :) |
Re: Treeview mit XML füllen
das com braucht die zähler zu speicherverwaltung.
das pointer macht nur die delphiwrapper platt. die vcl/rtl kümmert sich ja viel um speicher (z.B. bei strings) genillt wird der zeiger nicht, sonst wäre die schutzverletzung in $0 nur das obj dahinter wird freigegeben, also wie:
Delphi-Quellcode:
var
x: tobject; x:=tobject.create; x.free; // schutzverletzung hier caption:=x.classname; runterzählen wie du geschrieben hast - ja |
Re: Treeview mit XML füllen
Ok, danke nochmals ;-) Soweit alles verstanden hoffe/glaube ich ^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz