![]() |
TreeView: TreeNode -> untergeordneter Eintrag
Hoi?,
und gleich wieder eine Frage: Ich hab ein TreeView auf meiner Form. Jetzt möcht ich da Items reinstopfen. Das ist kein Problem.
Code:
^^ So sieht das dann aus.
Kategorie1
Ketegorie2 Wie schaffe ich aber das es auch so geht:
Code:
Kategorie1
+ Untereintrag <- Das hinzufügen + Untereintrag <- Das hinzufügen Ketegorie2 . . . |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Hai Spider,
das Problem hatte ich bei meiner Code-Library auch ;-) Wo gibst Du denn an zu welcher Kategrie ein Untereintrag gehört? |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Delphi-Quellcode:
var LNode: TTreeNode;
begin LNode := Treeview1.Items.Add(TreeView1.Items.GetFirstNode, 'Kategorie1'); TreeView1.Items.AddChild(LNode, 'Untereintrag1'); TreeView1.Items.AddChild(LNode, 'Untereintrag2'); |
Re: TreeView: TreeNode -> untergeordneter Eintrag
@Sharky
wie meinst? @Sir noch nicht ganz. Die Kategorie ist schon erzeugt. Unter diese Kategorie soll nun ein Eintrag. Das steht schon da:
Code:
und jetzt kann man zu jeder Kategorie noch einen Untereintrag machen können.
Kategorie1
Kategorie2 |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Vielleicht so?
Delphi-Quellcode:
var
i: Word; Node: TTreeNode; begin Assert(TreeView1.Items.Count > 0); with TreeView1 do begin Node := Items[0]; repeat Items.AddChild(Node, 'Untereintrag'); Node := Node.GetNextSibling until Node = nil; end; |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Zitat:
Aber die Frage bleibt: Wo/Wie wird in deinem Programm festgelegt zu welcher Kategorie ein neuer Eintrag gehört? |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Delphi-Quellcode:
Aufruf:
function FindRootNode(ACaption: String; ATreeView: TTreeView): TTreeNode;
var LCount: Integer; begin result := nil; LCount := 0; while (LCount < ATreeView.Items.Count) and (result = nil) do begin if (ATreeView.Items.Item[LCount].Text = ACaption) and (ATreeView.Items.Item[LCount].Parent = nil) then result := ATreeView.Items.Item[LCount]; inc(LCount); end; end;
Delphi-Quellcode:
[Edit2]Um allen Kritiken gerecht zu werden zur Funktion umgebaut[/Edit2]
var LDestNode: TTreeNode;
begin LDestNode := FindRootNode('Kategorie1', TreeView1); if LDestNode <> nil then begin TreeView1.Items.AddChild(LDestNode, 'Untereintrag1'); TreeView1.Items.AddChild(LDestNode, 'Untereintrag1'); end; end; |
Re: TreeView: TreeNode -> untergeordneter Eintrag
@Sir
so ists perfect! |
Re: TreeView: TreeNode -> untergeordneter Eintrag
@SirThornberry: Der Ansatz mit einer for-Schleife kann nicht funktionieren, da sich beim
Hinzufügen von Items die Item-Zahl erhöht aber TreeView1.Items.Count konstant bleibt, da's nur einmal aufgerufen wird. Dein Code fügt nur Kategorie1 etwas hinzu, nicht aber Ketegorie2 (auch wenn Ketegorie2 Kategorie1 heissen würde) |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Wenn Du jetzt nach dem hinzufügen der Untereinträge noch ein break; machst wird die Schleife nicht unnötig weiter durchlaufen.
|
Re: TreeView: TreeNode -> untergeordneter Eintrag
Zitat:
Delphi-Quellcode:
Da es per definition immer nur einen Node mit einer bestimmten ID (oder auch Text) geben kann funktioniert das so.
i_node := 0;
for ndx := 0 to TreeView1.Items.Count - 1 do begin if (PMyData(TreeView1.Items[ndx].data)^.id = datensatz.sparten_id) then begin i_node := ndx; Break; end; end; TreeView1.Items.AddChildObject(TreeView1.Items[i_node], datensatz.titel, Pointer(NodeData)); |
Re: TreeView: TreeNode -> untergeordneter Eintrag
@Toms,
stimmt. Bei zwei Kategorien gehts nicht. Der Code von dir Toms geht auch nicht. Wenn ich 3 Kategorien hab und füge in der letzen ein Untereintrag ein, dann fügt er überall einer ein. :? Aber ich glaube ihr habt mich noch nicht ganz verstanden. Die Kategorie heißt nicht immer Kategorie1 etc. Die kann jeden Namen annehmen so wie der User das möchte. |
Re: TreeView: TreeNode -> untergeordneter Eintrag
Moin Spider,
wann soll den Hinzugefügt werden? Wenn der Anwender einen Eintrag ausgewählt hat? |
AW: TreeView: TreeNode -> untergeordneter Eintrag
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Zusammen,
ich stehe mal wieder vor einem Wald und finde den passenden Baum nicht. Zum Problem: Ich habe die ListBox1, in der die Parents aufgeführt werden und die ListBox2 worin die Childs sind. Nun möchte ich den ersten Eintrag aus der ListBox1 in TreeView2 einfügen, was funktioniert. Nun sollen die Childs zum ersten Parent eingetragen werden, dann das 2. Parent und wieder die Childs. Irgendwo habe ich einen Denkfehler, ich komme aber nicht drauf. Damit klar ist, was ich vor habe, erst mal 2 Screens: So habe ich das bisherige Ergebnis: Anhang 40908 So soll es aber aussehen: Anhang 40909 Diesen Quelltext habe ich:
Delphi-Quellcode:
Ich weiß, dass ich dem Treeview irgendwie klar machen muss, unter welchem Parent ('XXXXX') was für ein Child soll, aber wie gesagt - Ich finde den richtigen Baum einfach nicht.
procedure TForm1.Button2Click(Sender: TObject);
var PA: Integer; //Parent Anzahl PZ: Integer; //Parent Zähler CA: Integer; //Child Anzahl CZ: Integer; //Child Zähler begin PZ := 0; CZ := 0; PA := listbox1.Items.Count; //Anzahl der Einträge in der Listbox1 ermitteln CA := listbox2.Items.Count; //Anzahl der Einträge in der Listbox2 ermitteln while PZ < PA do begin treeview2.Items.Add(nil, listbox1.Items[PZ]); while CZ < CA do begin treeview2.Items.AddChild('XXXXX', listbox2.Items[CZ]); // <---- Hier ist der Knackpunkt (vermute ich) CZ := CZ + 1; end; PZ := PZ + 1; CZ := 0; end; end; Könnt Ihr mir noch einmal einen Tipp geben? Wäre prima. Vielen Dank schon mal! LG DieFliege |
AW: TreeView: TreeNode -> untergeordneter Eintrag
@DieFliege: TTreeView.Items.Add gibt einen Node zurück, den du bei TTreeView.Items.AddChild als ParentNode verwenden musst. Ich hab vor wenigen Tagen ebenfalls mit TreeViews zu kämpfen gehabt, daher weiß ich das :-D.
MfG Dalai |
AW: TreeView: TreeNode -> untergeordneter Eintrag
Hallo Dalai,
vielen Dank für Deine Meldung. Ich hatte mir das schon gedacht und daher hatte ich dies versucht mit dieser Code-Zeile zu lösen:
Delphi-Quellcode:
Ergebnis war zwar, dass das Child eingetragen wurde, aber die weiteren Einträge als "Child-Child" - Irgendwie hab ich da noch einen Denkfehler.
.
. begin treeview2.Items.AddChild(treeview2.Items.Add(nil, listbox1.Items[PZ]), listbox2.Items[CZ]); CZ := CZ + 1; end; . . Meine Denkweise war, dass ich ein "Parent" habe und dies auch in einen TreeView eintrage, dann möchte ich den nächsten Eintrag in "Parent -> Child" vornehmen, also gebe ich das betreffende "Parent" an und trage das "Child" ein - Soweit die Theorie: - Eintrag von Parent1 im TreeView - Eintrag von Child1: Parent1 -> Child1 - Eintrag vom Child2: Parent1 -> Child2 - Eintrag vom Child3: Parent1 -> Child3 - Eintrag von Parent2 im TreeView - Eintrag von Child1: Parent2 -> Child1 - Eintrag vom Child2: Parent2 -> Child2 - Eintrag vom Child3: Parent2 -> Child3 Daher auch die Schleifen, da ich die Listboxen zur Laufzeit fülle. Gruß DieFliege |
AW: TreeView: TreeNode -> untergeordneter Eintrag
Du wirst wohl Zwischenvariablen brauchen. In Pseudocode:
Delphi-Quellcode:
for ParentIndex := 0 to ParentNodes.Count - 1 do
begin ParentNode := TreeView.Items.AddChild(nil, ParentNodes[ParentIndex]); for ChildIndex := 0 to ChildNodes.Count - 1 do TreeView.Items.AddChild(ParentNode, ChildNodes[ChildIndex]); end; |
AW: TreeView: TreeNode -> untergeordneter Eintrag
Hallo Detlef,
wieder mal vielen Dank! Dein Tipp mit den Zwischenvariablen war goldrichtig. Für alle, die es interessiert, hier noch mal mein alter Code und darunter der neue funktionierende: ALT (mit Fehler):
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var PA: Integer; //Parent Anzahl PZ: Integer; //Parent Zähler CA: Integer; //Child Anzahl CZ: Integer; //Child Zähler begin PZ := 0; CZ := 0; PA := listbox1.Items.Count; //Anzahl der Einträge in der Listbox1 ermitteln CA := listbox2.Items.Count; //Anzahl der Einträge in der Listbox2 ermitteln while PZ < PA do begin treeview2.Items.Add(nil, listbox1.Items[PZ]); while CZ < CA do begin treeview2.Items.AddChild('XXXXX', listbox2.Items[CZ]); // <---- Hier ist der Knackpunkt (vermute ich) CZ := CZ + 1; end; PZ := PZ + 1; CZ := 0; end; end; NEU (funktioniert):
Delphi-Quellcode:
Vielen Dank an alle die mir geholfen haben, ein echt prima Forum! Und Detlef - nun darf ich mein Programm sogar "Version 1.1" nennen ;-)
procedure TForm1.Button2Click(Sender: TObject);
var PA: Integer; //Parent Anzahl PZ: Integer; //Parent Zähler CA: Integer; //Child Anzahl CZ: Integer; //Child Zähler myNode: TTreeNode; begin PZ := 0; CZ := 0; PA := ListBox1.Items.Count; //Anzahl der Einträge in der Listbox1 ermitteln CA := ListBox2.Items.Count; //Anzahl der Einträge in der Listbox2 ermitteln while PZ < PA do begin myNode := TreeView2.Items.Add(nil, ListBox1.Items[PZ]); while CZ < CA do begin TreeView2.Items.AddChild(myNode, ListBox2.Items[CZ]); CZ := CZ + 1; end; PZ := PZ + 1; CZ := 0; end; end; LG DieFliege |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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