![]() |
Tree und seine Eigenschaften
Hallo DP-User!
Heute wollte ich mich mit einer Baumansicht beschäftigen. Mit dieser Komponente hab ich noch keine Erfahrungen gemacht und mich mit der Forensuche etwas eingelesen. Gegeben ist folgende Baumstruktur: Menschen | Katzen | Hunde Auf Knopfdruck wird ein ini-File ausgelesen: [1. Element] Rasse=M Alter=30 Name=Horst [2. Element] Rasse=K Alter=6 Name=Muschi [3.Element] Rasse=H Alter=2 Name=Milchbart Somit ergibt sich folgende Baumstruktur: Menschen |-Horst |Katzen |-Muschi |Hunde |-Milchbart Meine Prozedur prüft den String der Rasse und Ordnet dann den Namen in den passenden Knoten ein. Soweit sogut. Meine Absicht ist es, auf Knopfdruck alle Unterkategorien der jeweiligen Rasse zu markieren und das jeweilige Alter auszugeben. Für diesen Fall markiert der Button den ersten gefundenen Menschen Menschen |-Horst |Katzen |-Muschi |Hunde |-Milchbart Als Result müsste dann 30 rauskommen. Die Funktion selektiert dann den nächsten gefundenen Eintrag. In dem Fall ist es kein Mensch, sondern die Katze Muschi. Menschen |-Horst |Katzen |-Muschi |Hunde |-Milchbart Muschi ist 6. Was ich jetzt wissen möchte: Wie kann ich auf Knopfdruck die gefundenen Rassen selektieren UND.. wie kann ich auf den selektierten Eintrag reagieren? Ich habe leider nicht die geringste Ahnung wie dafür die Syntax lauten würde. habt ihr einen Tip?A |
Re: Tree und seine Eigenschaften
Selektiert werden Einträge mit TTreeNode.Selected := true. Und während du noch alle Nodes eine Kategorie heraussuchst, kannst du ja schon die Alterswerte zusammenaddieren.
|
Re: Tree und seine Eigenschaften
Also ich hätte es so gemacht:
Wenn du jetzt auf den Button klickst, muss du nur die eindeutige Nummer abfragen und dann die Daten aus dem Array lesen. [edit]Kennzeichne die Oberbegriffe (= Rassennamen) eindeutig (alle haben die gleichen "Eindeutigkeit") und gehe dann alle Items des TreeViews durch, und überprüfe, ob es ein Oberbegriff ist, oder ob es eine Unterkategorie. Hier mal was praktisches :P
Delphi-Quellcode:
Hinweise: Die eindeutige Nummer ist in "StateIndex" gespeichert. 0 = Oberbegriff[/edit]
procedure getItems;
var i : Integer; begin // Gehe alle Items durch for i := 0 to TreeView1.Items.Count - 1 do begin // Wenn das Item kein Oberbegriff ist if TreeView1.Items[i].StateIndex > 0 then // Gebe den Namen und das ALter dazu aus // Wobei das alter in "ages" gespeichert wurde Showmessage('Alter von ' + TreeView1.Items[i].Caption + ' ist ' + IntToStr(ages[TreeView1.Items[i].StateIndex - 1]) + ' Jahre'); end; end; PS: Ich hoffe das war deine Fragestellung :D |
Re: Tree und seine Eigenschaften
Guten Morgen!
Und vielen Danke für eure tips! ich versuche das mal nach dem Motto: vom Kleinen zum Großen zu realisieren. Dazu muss ich wissen: was ist ein Child meines Trees und was ist das übergeordnete Element. Wenn ich mir die items dieses Baumes: Menschen |-Horst |Katzen |-Muschi |Hunde |-Milchbart ausgeben lasse mit:
Delphi-Quellcode:
kommt 6 heraus - was völlig logisch ist. Wie trenne ich nun den Horst vom Menschen?
Showmessage(IntToStr(Tree.Items.count));
xZise schlägt vor, bei der Erstellung des Childs "Horst" einen Stateindex zu setzen. Gute Idee. Meine Prozedur um Childs zu erzeugen sieht grob so aus:
Delphi-Quellcode:
damit füge ich "Horst" in der Kategorie Menschen hinzu. Wie vergebe ich dem Horst einen Stateindex?
Tree.Items.AddChild(GetTreeItems(Tree.Items, 'Menschen'), 'Horst');
|
Re: Tree und seine Eigenschaften
Hab wieder die Forensuche durchwühlt und folgenden interessanten Beitrag entdeckt:
Delphi-Quellcode:
Das ist schonmal etwas! Jetzt bleibt noch die Frage wie ich dem Child bei der Erstellung einen Stateindex geben kann?
var
node : TTreeNode; begin node := Treeview1.Selected; if Assigned(node) then if node.Level >= 1 then ShowMessage('Child angeklickt') else ShowMessage('nur die Wurzel getroffen...') |
Re: Tree und seine Eigenschaften
"StateIndex" ist eine Eigenschaft des TreeNodes.
Der Code überprüft "nur" auf welchen Level das Node ist (0 = Grundlevel) |
Re: Tree und seine Eigenschaften
Ich habs nun anders gelöst :-D
Ich vergebe eine fortlaufende Indexnummer im Unterkategorie Namen mit bei dessen Erstellung. Wenn ich dann auf ein Child Element klicke frag ich dessen Namen ab. Die Indexnummer kann ich mir mit der Stringfunktion Copy herausschneiden und somit ist jedes Child Element eindeutig zuzuordnen :) Nicht elegant aber es funktioniert prima! Zusammen mit den anderen codeschnipsel kann ich wunderbar auf den klick eines Child Elements reagieren :roll: Nur wie ich die Child Elemente einzeln per Button durchklicken kann weiss ich nicht nicht genau. |
Re: Tree und seine Eigenschaften
Zitat:
Edit: Was mir noch aufgefallen ist (bei xZise):
Delphi-Quellcode:
ist performance-technisch eher ungünstig (vor allem bei vielen Knoten).
...
for i := 0 to TreeView1.Items.Count - 1 do begin .... end; ... intern durchläuft Delphi nämlich jedes mal den Kompletten Baum bis er item [i] gefunden hat udn fängt für das nächste wieder oben an. Anstelle einer "for i:= ..." Anweisung bietet sich beim Treeview generell eher folgendes an:
Delphi-Quellcode:
node:=TreeView1.Items.GetFirstNode;
while node <> nil do begin ... node:=node.getnext; end; |
Re: Tree und seine Eigenschaften
Hmm es will nicht so richtig klappen.
Mein Button soll alle Child Elemente eines Trees durchlaufen und den Text dazu ausgeben Menschen | |-Horst | |-Herbert | |Katzen | |-Muschi | |-Cleo
Delphi-Quellcode:
Als Ergebnis bräuchte ich nun nacheinander die Strings: "Horst", "Herbert", "Muschi", "Cleo"
Procedure Button1.Click(Sender: TObject);
var node, child: TTreeNode; Begin node:=TreeView1.Items.GetFirstNode; while node <> nil do begin child := node.GetFirstChild; Showmessage(child.Text); node := node.GetNext end; End; Es gibt unendlich viele Treeview Topics hier und keins hilft mir so recht bei der Lösung. Oder ich sehe die Lösung vor lauter Lösungen nicht :shock: |
Re: Tree und seine Eigenschaften
Versuch es mal damit:
Delphi-Quellcode:
Procedure Button1.Click(Sender: TObject);
var node: TTreeNode; Begin node:=TreeView1.Items.GetFirstNode; while node <> nil do begin if node.level = 1 then Showmessage(node.Text); node := node.GetNext end; End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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 by Thomas Breitkreuz