Autor Beitrag
Silvia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 15.02.05 13:13 
Hallo,

ich schlage mich mit Treeview's und xml herum, und habe folgenden Source!

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
procedure TForm1.Button4Click(Sender: TObject);
var
  tn : TTreeNode;
  XMLDoc : TXMLDocument;
  iNode : IXMLNode;
  flag: string;
  trueorfalse: boolean;
  test : integer;
  StrArry: TStringDynArray;
  //IntArry: TIntegerDynArray;
  a: string;
  b: integer;
  eins, h : integer;

  procedure ProcessTreeItem(tn : TTreeNode; iNode : IXMLNode; flag : string);
  var
    cNode : IXMLNode;

  begin
  flag := '1';
  if (tn = nil) then Exit;
    if (tn.Text <> Treeview1.TopItem.Text) then
      tn := tn.GetNext; // ****************mit getNext werden einige Knoten übersprunen!**************** 

    StrArry := Explode(tn.Text, '.');
    if Length(StrArry) > 0 then
      test := High(StrArry);

      a := StrArry[test];
      trueorfalse := IsValidInteger(StrArry[test]);

      if (trueorfalse = false) then
        begin
        StrArry := Explode(tn.Text, '-');
        if Length(StrArry) > 0 then
          eins := 0;
          test := High(StrArry);
          //for a := 0 to 9 do
          //ShowMessage(StrArry[test]);
          a := strArry[eins];
          trueorfalse := IsValidInteger(StrArry[test]);
        end;

        if (trueorfalse = false) then begin
            trueorfalse := IsValidCurrency(StrArry[test]);
        end;
        if (trueorfalse = false) then begin
            trueorfalse := IsValidExtended(StrArry[test]);
        end;    
        if (trueorfalse = true) then begin
            h :=  POS('_',tn.Text);
        end;

        if (h <> 1) then begin
           tn.Text := '_' + tn.text;
        end;

        if (tn.text <> '') then
        begin
          flag := '1';
//******** und hier nochmal********************
          cNode := iNode.AddChild(tn.Text)
        end;

        tn := tn.getFirstChild();

        while tn <> nil do
        begin
           ProcessTreeItem(tn, cNode,flag);
           tn := tn.getNextSibling;
        end;
     end;
      (*ProcessTreeItem*)
  begin
     XMLDoc := TXMLDocument.Create(nil);
     XMLDoc.Active := True;
     tn := TreeView1.TopItem;
  while tn <> nil do
  begin
     //ProcessTreeItem (tn, iNode);
// **********Hier wird der ROOT-Knoten vorgegeben!!**************
     iNode := XMLDoc.AddChild(Treeview1.TopItem.Text);
//     flag:='1';
     ProcessTreeItem (tn, iNode, flag);
     tn := tn.getNextSibling;
  end;
  SaveDialog1.Execute;
  XMLDoc.SaveToFile(ChangeFileExt(SaveDialog1.FileName,'.XML'));
  Application.processmessages
end;


Der Source erstellt mir eine XML Datei mit einem vorgegebenen ROOT-Knoten.
Ich möchte aber nicht den Root-Knoten vorgeben sondern mein Prog soll sich den ersten Knoten aus
der Treeview nehmen! Wenn ich mein Prog starte erstellt es mir zweimal das TopItem!
Was muss ich ändern, damit mein Prog nicht den Knoten zweimal erstellt?

Gruß

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 15.02.05 13:20 
Zeile 84 und 85 umtauschen?
Silvia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 15.02.05 13:41 
Wenn ich Zeile 84 und 85 umtausche wird der Treeview nicht duchlaufen und in der XML steht nur der Root-Knoten!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.02.05 14:51 
Ich habe das TXmlDocument nicht, aber das Prinzip ist doch IMHO recht simpel. Du brauchst eine Routine, die sich durch die ganzen Knoten im Tree-View hangelt. Die startest du das erste Mal mit dem TopNode des Baums. Vereinfacht ausgedrückt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
  procedure ProcessTreeItem(const ParentTreeNode: TTreeNode; ParentXmlNode: IXmlNode;
    XmlDoc: TXmlDocument);
  var
    ChildXmlNode : IXmlNode;
  begin
    if(ParentTreeNode = nil) then exit;

    // neuen Knoten erstellen
    if(ParenXmlNode <> nil) then
      ChildXmlNode := ParentXmlNode.AddChild(ParentTreeNode.Text)
    else
      ChildXmlNode := XmlDoc.AddChild(ParentTreeNode.Text);

    // untergeordnete Knoten eintragen
    if(ParentTreeNode.Count > 0) then
      for i := 0 to ParentTreeNode.Count - 1 do
        ProcessTreeItem(ParentTreeNode.Item[i],ChildXmlNode,XmlDoc);
  end;

var
  XmlDoc : TXmlDocument;

begin
  XmlDoc := TXmlDocument.Create(nil);
  { ... }

  ProcessTreeItem(TreeView1.TopItem,nil,XmlDoc);

  { ... }
end;

Wie gesagt, ich habe keine Ahnung von dieser TXmlDocument-Komponente, darum habe ich einfach mal geraten was den Code angeht. Kann sein, dass du noch spezielle Attribute o.ä. setzen musst (irgendeine Bedeutung muss ja dein "StrArray" usw. haben), aber grundlegend sollte dieser Code eine XML-Struktur deines Tree-Views aufbauen.