Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Treeview mit XML-Dokument füllen (https://www.delphipraxis.net/135582-treeview-mit-xml-dokument-fuellen.html)

Lizzy 13. Jun 2009 18:26


Treeview mit XML-Dokument füllen
 
Hallo ich habe jetzt ein XML-Dokument, dass ich gerne in Delphi(noch besser Lazarus) bearbeiten möchte. Ich habe mich hier schon umgesehen und bin zum entschluss gekommen, dass ich es am besten mit treeview machen sollte(oder?). Das problem ist, ich kenne mich mit Treeview überhaupt nicht aus - ich kenne XML auch erst seit kurzem. Kannst du mir vielleicht dabei helfen, vielleicht erst einmal das TreeView mit den XML-Informationen zu füllen (am besten genauso strukturiert). Das wär soo toll und nett! :)

Hier der anfang des XML-Dokuments:

XML-Code:
<?xml version="1.0" encoding="iso-8859-1" ?>
- <Setup>
- <Microscope>
  <name>Axioplan</name>
  <number>0</number>
- <Objectives>
  <ActiveObjective>none</ActiveObjective>
  </Objectives>
- <xyStage>
  <XStageOffset>0</XStageOffset>
  <ScanDirection>+</ScanDirection>
  <XStart>0</XStart>
  <XStep>200</XStep>
  <XMaxPos>11</XMaxPos>
  <YStageOffset>0</YStageOffset>
  <YStart>0</YStart>
  <YStep>500</YStep>
  <YMaxPos>3</YMaxPos>
  </xyStage>
- <focus>




PS: Viellicht wirst du sagen, dass ich erstmal andere Beiträge durchlesen soll bevor ich ein neues Thema anfange. Aber das habe ich bereits, aber ich habe gemerkt, dass die meinsten schon viel weiter sind und sich nicht mit diesen grundlegneden problemen beschäftigen.

[edit=mkinzler]XML-Tag eingefügt Mfg, mkinzler[/edit]

himitsu 17. Jun 2009 11:41

Re: Treeview mit XML-Dokument füllen
 
Es kommt erstmal darauf an, wie und was du in dem TreeView anzeigen möchtest.

Ein Beispiel fündest du z.B. in Hier im Forum suchenhimXML > demos\Demo_Tree > Demo_TreeU.pas > TForm1.FillTree

in Kurz sähe Dieses etwa so aus:
Delphi-Quellcode:
Procedure TForm1.FillTree;
  Procedure Fill(Nodes: TXMLNodeList; Item: TTreeNode);
    Var Node: TXMLNode;
      Item2: TTreeNode;

    Begin
      Node := Nodes.FirstNode;
      While Assigned(Node) do Begin
        Item2 := TreeView1.Items.AddChildObject(Item, Node.Name, nil);
        If Node.Nodes.hasChildNodes Then Fill(Node.Nodes, Item2);
        Node := Node.NextNode;
      End;
    End;

  Begin
    TreeView1.Items.Clear;
    Fill(XML.Nodes, nil);
  End;
Du nimmst dir den Hauptnode des XML-Dokuments vor und füllst dessen Knoten in den Hauptknoten des TreeView ein

Hat ein XML-Node "Kinter" (untergeordnete Nodes), dann nimmst du wiederum diese und füllst sich in den entsprechenden Knoten des TreeView und wiederholst das so lange, bis alles drin ist.

Das wäre so die "einfache" rekursive Methode.

Lizzy 8. Jul 2009 08:37

Re: Treeview mit XML-Dokument füllen
 
Danke, das ist sehr nett von dir! Ich werde es sofort ausprobieren sobald von aus dem urlaub bin!
Lizzy :)

t4rI 22. Jul 2009 09:14

Re: Treeview mit XML-Dokument füllen
 
Hi,
ich hatte auch diese Problem habe das Programm jedoch inzwischen zum Laufen gebracht....
Mein nächstes Problem ist es aber, den Treeview mit den Atrributen der XML zufüllen... :wall:
Kann mir hierbei jmd helfen?

Mfg
t4rI

t4rI 22. Jul 2009 09:33

Re: Treeview mit XML-Dokument füllen
 
sry =) ich sollte vllt auch einen Code dazufügen.....

Delphi-Quellcode:
procedure TForm1.XMLtoTree;
var
  iNode: IXMLNode;
  Data : PTreeData;
  TreeData : TTreeDataClass;
    procedure ProcessNode(Node: IXMLNode; TreeNode: PVirtualNode);
    var
        cNode: iXMlNode;
        VNode, V2Node : PVirtualNode;
        Test : String;
    begin
        if Node = nil then Exit;



        TreeNode := VirtualTree.AddChild(nil);
        Data := VirtualTree.GetNodeData(TreeNode);
        Data.FCaption := Node.NodeName;
        Node := INode.AddChild(Data.FCaption);


        if Node.HasChildNodes then begin
            cNode := Node.ChildNodes[0];
            VNode := VirtualTree.AddChild(TreeNode, nil);
            Data := VirtualTree.GetNodeData(VNode);
            Data.FCaption := cNode.NodeName;
            cNode := Node.AddChild(Data.FCaption);

        if cNode.HasChildNodes then
            cNode := Node.ChildNodes[0];
            V2Node := VirtualTree.AddChild(VNode, nil);
            Data.FCaption := cNode.NodeName;
            cNode := Node.AddChild(Data.FCaption);

            //Data hinzufügen
            //Data -> FCaption = Name der Node
            //Data -> FObject -> FBeschreibung = Attribut aus XML

            while cNode <> nil do
            begin
              ProcessNode(cNode, TreeNode);
              cNode := cNode.NextSibling;
            end;
        end;



procedure TForm1.TreeToXML(aFirstnode: PVirtualNode);
var
ProjektHomeNode : IXMLNode;
tn : PVirtualNode;
iNode : IXMLNode;
Data : PTreeData;
TreeData : TTreeDataClass;
procedure ProcessTreeItem(
        tn   : PVirtualNode;
        iNode : IXMLNode;
        Data : PTreeData;
        TreeData : TTreeDataClass);
var
cNode : IXMLNode;
begin
    if (tn=Nil) then Exit;
        Data := VirtualTree.GetNodeData(tn);
        cNode := INode.AddChild(Data.FCaption);
        cNode.Attributes['Beschreibung']:= TreeData.FBeschreibung;
        cNode.Attributes['Startzeit']:= TreeData.FStartzeit;
        cNode.Attributes['Zielzeit'] := TreeData.FZielzeit;
        cNode.Attributes['Status'] := TreeData.FCombo1;
        cNode.Attributes['Priorität']:= TreeData.FCombo2;
        tn := tn.FirstChild;
    while tn <> nil do begin
        ProcessTreeItem(tn, cNode, Data, TreeData);
        tn := tn.NextSibling;
    end;
end;
  (*ProcessTreeItem*)
begin
    ProjektDocument.Active := True;
    Data := VirtualTree.GetNodeData(aFirstnode);
    tn := aFirstnode;
    ProjektHomeNode := ProjektDocument.AddChild('Projekt');
    iNode := ProjektHomeNode.AddChild(Data.FCaption);
    tn := VirtualTree.TopNode;
    TreeData := Data.FObject;
    iNode.Attributes['Beschreibung']:= TreeData.FBeschreibung;
    iNode.Attributes['Startzeit']:= TreeData.FStartzeit;
    iNode.Attributes['Zielzeit'] := TreeData.FZielzeit;
    iNode.Attributes['Status'] := TreeData.FCombo1;
    iNode.Attributes['Priorität']:= TreeData.FCombo2;
    while tn <> nil do
        begin
        ProcessTreeItem (tn, iNode, Data, TreeData);
        tn := tn.NextSibling;
        end;
end;



Danke !!!!
MFG t4rI

[edit=mkinzler]Tag korrigiert Mfg, mkinzler[/edit]

t4rI 22. Jul 2009 16:36

Re: Treeview mit XML-Dokument füllen
 
Naja ... :wall:
Hab es selbst hinbekommen ;)
Danke trotzdem
Gruß
t4rI

Lizzy 9. Aug 2009 16:31

Re: Treeview mit XML-Dokument füllen
 
Sry, ich kriegs trotzdem nicht hin: wo soll ich das XMLDokument reinladen? ein weiteres problem ist, ich hab nur azarus, dh viele befehle werden beim debuggen markiert. Wisst ihr vllt weiter?

fs999 24. Jan 2017 12:50

AW: Treeview mit XML-Dokument füllen
 
Zitat:

Zitat von himitsu (Beitrag 923068)
Es kommt erstmal darauf an, wie und was du in dem TreeView anzeigen möchtest.

Ein Beispiel fündest du z.B. in Hier im Forum suchenhimXML > demos\Demo_Tree > Demo_TreeU.pas > TForm1.FillTree

in Kurz sähe Dieses etwa so aus:
Delphi-Quellcode:
Procedure TForm1.FillTree;
  Procedure Fill(Nodes: TXMLNodeList; Item: TTreeNode);
    Var Node: TXMLNode;
      Item2: TTreeNode;

    Begin
      Node := Nodes.FirstNode;
      While Assigned(Node) do Begin
        Item2 := TreeView1.Items.AddChildObject(Item, Node.Name, nil);
        If Node.Nodes.hasChildNodes Then Fill(Node.Nodes, Item2);
        Node := Node.NextNode;
      End;
    End;

  Begin
    TreeView1.Items.Clear;
    Fill(XML.Nodes, nil);
  End;
Du nimmst dir den Hauptnode des XML-Dokuments vor und füllst dessen Knoten in den Hauptknoten des TreeView ein

Hat ein XML-Node "Kinter" (untergeordnete Nodes), dann nimmst du wiederum diese und füllst sich in den entsprechenden Knoten des TreeView und wiederholst das so lange, bis alles drin ist.

Das wäre so die "einfache" rekursive Methode.

Da fehlen noch die Werten...

Delphi-Quellcode:
      ...
      Item2 := Items.AddChildObject(Item, Node.Name, nil);
      if Node.Nodes.NodeCount > 0 then
        Fill(Node.Nodes, Item2)
      // wenn keine subnodes dann Wert einfügen !
      else
        Items.AddChildObject(Item2, Node.XMLText, nil);
      Node := Node.NextNode;
      ...
mfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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