AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treeview mit XML füllen

Offene Frage von ".chicken"
Ein Thema von .chicken · begonnen am 13. Dez 2007 · letzter Beitrag vom 28. Dez 2007
Antwort Antwort
Seite 1 von 2  1 2      
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#1

Treeview mit XML füllen

  Alt 13. Dez 2007, 16:52
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:
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;
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.
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:
<?xml version='1.0' encoding='ISO-8859-1'?>
<dialogsammlung>
<Gespraech_mit_dem_Clown>
<sentence>Hallo, ich bin Marry, der Clown</sentence>
<option>Hi, ich bin Todd. Sehr erfreut!</option>
<option>Das interessiert mich doch nicht!</option>
</Gespraech_mit_dem_Clown>
<Gespraech_mit_Lisa>
<sentence>Hi, ich bin Lisa, das Supermodel</sentence>
<option>Du hast wirklich wahnsinnig große...Augen!</option>
<option>Sorry, aber ich habe keine Zeit für sowas. Ich muss die Welt retten!</option>
</Gespraech_mit_Lisa>
</dialogsammlung>
Da diese aber unbeschränkt viele Verschachtelungen haben kann, stellt sich das alles für mich als ein Problem dar.

Weiss wer wo der Fehler liegt? Wie mach ichs besser?

Danke schonmal!
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Treeview mit XML füllen

  Alt 14. Dez 2007, 02:32
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:
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;
Ohne Garantie! Wie gesagt, ich kenne IXMLDOMNodeList nicht.
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#3

Re: Treeview mit XML füllen

  Alt 14. Dez 2007, 05:39
Probier ich heute Nachmittag, vielen Dank

Das Objekt gibts auf der Microsoft HP, XML4.0
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#4

Re: Treeview mit XML füllen

  Alt 14. Dez 2007, 17:15
Ok, es klappt noch nicht ganz wie ich es möchte. Das hier ist meine XML-Datei:
Zitat:
<?xml version='1.0' encoding='ISO-8859-1'?>
<dialogsammlung>
<Gespraech_mit_dem_Clown>
<sentence>
Hallo, ich bin Marry, der Clown!
<collection>
<option>
Hi, ich bin Todd. Sehr erfreut!
<sentence>
Todd, kann ich dich um einen Gefallen bitten?
<collection>
<option>
Was darfs denn sein?
<sentence>
Ich habe meine Nase verloren, würdest du sie suchen?
<ende />
</sentence>
</option>
<option>
Kannst du das bitte nochmal wiederholen?
<move>Hier kommt dann eine Anweisung, wohin das Script sich bewegen soll, zB zurück zum ersten Sentence ("Hallo, ich bin Marry, der Clown!")</move>
</option>
<option>
Ich habe keine Zeit für sowas!
<ende />
</option>
</collection>
</sentence>
</option>
<option>
Lass mich in Ruhe! Ich habe keine Zeit!
<ende />
</option>
</collection>
</sentence>
</Gespraech_mit_dem_Clown>
</dialogsammlung>
So im Anhang habe ich ein Bild, wie das in den Treeview eingefügt wird. Und hier kommt meine Prozedur:
Delphi-Quellcode:
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 = 'collectionthen
      aTree.Text := 'Collection'
    else
    if subNode.nodeName = 'endethen
      aTree.Text := 'Ende';
    //Präfixe Ende
    if subNode.childNodes.length > 0 then
    begin
      NewParent := aTree;
      UpdateTree(subNode.childNodes, NewParent);
    end;
  end;
end;
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.

Wie lässt sich das verhindern?
Stehe da etwas auf dem Schlauch :-\
Angehängte Grafiken
Dateityp: bmp dialogexample_204.bmp (1,50 MB, 57x aufgerufen)
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#5

Re: Treeview mit XML füllen

  Alt 16. Dez 2007, 11:17
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:
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);
Ich krich immer ne AccessViolation, bei der letzen Zeile! (Dass die hier keinen Sinn macht ist klar, ist nur zum Zweck des Zeigens.
Folgendes funktioniert aber:
Delphi-Quellcode:
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);
Was mache ich falsch? Kann mir bitte wer dabei helfen? Ich verzweifele ^^
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#6

Re: Treeview mit XML füllen

  Alt 25. Dez 2007, 21:31
Bitte, kann mir niemand helfen?
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#7

Re: Treeview mit XML füllen

  Alt 26. Dez 2007, 13:22
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:
  vst.nodedatasize:=sizeof(IXMLDOMNode);

var
  node: pvirtualnode;
  xmlobj: IXMLDOMNode;

  [...]
  node:=vst.addchild(nil, xmlobj);

  xmlobj:=IXMLDOMNode(vst.getnodedata(node)^);
auf das ^ achten!
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#8

Re: Treeview mit XML füllen

  Alt 26. Dez 2007, 13:27
Ok, vst ist ein TTreeNode?

Aber was für ein Video meinst du denn?!? o.O

Danke schonmal! Probiere das nacher mal!
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Treeview mit XML füllen

  Alt 26. Dez 2007, 14:03
Ups, du nutzt das native Control TTreeview.

Meine Antwort bezieht sich auf den VirtualStringTree (VST) von Mike Lischke.
Kostenlos und Opensource
VST Page

Vom native Control habe ich keine Ahnung.


Diese Videos:
Video's vom 2. DPST
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
.chicken

Registriert seit: 5. Dez 2006
459 Beiträge
 
#10

Re: Treeview mit XML füllen

  Alt 26. Dez 2007, 14:53
Hm schade, danke trotzdem! Kann wer anders dann weiterhelfen? ^^
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 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