Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Tree und seine Eigenschaften (https://www.delphipraxis.net/82394-tree-und-seine-eigenschaften.html)

Ajin 12. Dez 2006 13:21


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

Khabarakh 12. Dez 2006 13:41

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.

xZise 12. Dez 2006 15:25

Re: Tree und seine Eigenschaften
 
Also ich hätte es so gemacht:
  • Versehe die Unterkategorien mit einer eindeutigen Nummer (StateIndex, SelectedIndex oder ImageIndex ... Muss du gucken)
  • Erstelle ein Array, in dem die Daten (z.B. das Alter) gespeichert ist, und die dazugehörige ID, ist die eindeutige ID

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:
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;
Hinweise: Die eindeutige Nummer ist in "StateIndex" gespeichert. 0 = Oberbegriff[/edit]

PS: Ich hoffe das war deine Fragestellung :D

Ajin 13. Dez 2006 08:41

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:
Showmessage(IntToStr(Tree.Items.count));
kommt 6 heraus - was völlig logisch ist. Wie trenne ich nun den Horst vom Menschen?

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:
Tree.Items.AddChild(GetTreeItems(Tree.Items, 'Menschen'), 'Horst');
damit füge ich "Horst" in der Kategorie Menschen hinzu. Wie vergebe ich dem Horst einen Stateindex?

Ajin 13. Dez 2006 10:09

Re: Tree und seine Eigenschaften
 
Hab wieder die Forensuche durchwühlt und folgenden interessanten Beitrag entdeckt:

Delphi-Quellcode:
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...')
Das ist schonmal etwas! Jetzt bleibt noch die Frage wie ich dem Child bei der Erstellung einen Stateindex geben kann?

xZise 13. Dez 2006 14:11

Re: Tree und seine Eigenschaften
 
"StateIndex" ist eine Eigenschaft des TreeNodes.

Der Code überprüft "nur" auf welchen Level das Node ist (0 = Grundlevel)

Ajin 13. Dez 2006 14:33

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.

kaiser1401 13. Dez 2006 15:14

Re: Tree und seine Eigenschaften
 
Zitat:

Zitat von Ajin
Nur wie ich die Child Elemente einzeln per Button durchklicken kann weiss ich nicht nicht genau.

Wenn du das erste child hast könntest du das mit getNextSibling machen (methode des TTreeNodeItem) wenn es der letzte Unterknoten der wurzel auf dieser ebene (level) war gibts NIL zurück.

Edit:
Was mir noch aufgefallen ist (bei xZise):
Delphi-Quellcode:
...
for i := 0 to TreeView1.Items.Count - 1 do begin
....
end;
...
ist performance-technisch eher ungünstig (vor allem bei vielen Knoten).

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;

Ajin 13. Dez 2006 16:36

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:
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;
Als Ergebnis bräuchte ich nun nacheinander die Strings: "Horst", "Herbert", "Muschi", "Cleo"

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:

kaiser1401 13. Dez 2006 16:38

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 14:09 Uhr.
Seite 1 von 2  1 2      

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