AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tree und seine Eigenschaften

Ein Thema von Ajin · begonnen am 12. Dez 2006 · letzter Beitrag vom 14. Dez 2006
Antwort Antwort
Seite 1 von 2  1 2      
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#1

Tree und seine Eigenschaften

  Alt 12. Dez 2006, 14:21
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Tree und seine Eigenschaften

  Alt 12. Dez 2006, 14:41
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Tree und seine Eigenschaften

  Alt 12. Dez 2006, 16:25
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
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 09:41
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: 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:

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?
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 11:09
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?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 15:11
"StateIndex" ist eine Eigenschaft des TreeNodes.

Der Code überprüft "nur" auf welchen Level das Node ist (0 = Grundlevel)
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 15:33
Ich habs nun anders gelöst

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

Nur wie ich die Child Elemente einzeln per Button durchklicken kann weiss ich nicht nicht genau.
  Mit Zitat antworten Zitat
kaiser1401

Registriert seit: 6. Mär 2006
Ort: Gescher
157 Beiträge
 
Delphi 7 Professional
 
#8

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 16:14
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;
inc(i);
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 17:36
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
  Mit Zitat antworten Zitat
kaiser1401

Registriert seit: 6. Mär 2006
Ort: Gescher
157 Beiträge
 
Delphi 7 Professional
 
#10

Re: Tree und seine Eigenschaften

  Alt 13. Dez 2006, 17:38
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;
inc(i);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 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