Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Im Treeview unterpunkte zählen


Krefti - Di 03.03.09 12:49
Titel: Im Treeview unterpunkte zählen
Hi zusammen,

ich hab jetzt schon eine ganze weile das Forum durchsucht und nicht das passende gefunden.

Ich möchte in meinem Treeview auf unterster hierarchieebene die anzahl der unterpunkte ermitteln.

Wie mach ich das??

mit Treeview.item.items[].count ??

wenn ja, steht in items[] die hierarchieebene??

Vielen Dank schon mal für eure hilfe!

gruß


elundril - Di 03.03.09 12:57

das müsstest du imho mit rekusion realisieren. Wie genau kann ich dir nicht sagen, hab grad kein delphi da. vl. reicht das ja schon als gedankenanstoss^^

lg elundril


Krefti - Di 03.03.09 13:04

danke schon mal für die antwort..

*nachdenk*

ähh..was rekusion bedeutet weiß ich allerdings nicht wirklich..werd mal suchen, aber wenn mir dazu jemand noch helfen könnte wäre wirklich super..

danke!


Narses - Di 03.03.09 14:14

Moin!

user profile iconKrefti hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte in meinem Treeview auf unterster hierarchieebene die anzahl der unterpunkte ermitteln.
Kannst du mal erläutern, was du damit genau meinst? Die Anzahl der Knoten, die keine Kinder haben (=Blätter)? :gruebel:

cu
Narses


Krefti - Di 03.03.09 14:23

also folgendermaßen:

Mein treeview soll insgesamt 6 Ebenen haben. Sichtbar sind beim Aufrufen des Dialogs 5. Der 5. ebene kann man eine unbegrenzte Anzahl an Unterpunkten hinzufügen, die werden dann mit dem gleichen Namen geöffnet, der durchnummeriert ist. Jetzt soll die Möglichkeit bestehen, dass der Nutzer einzelne Datensätze(Unterpunkte) wieder löschen kann. Jetzt möchte ich die durchnummerierte folge, die durch das Löschen entstanden ist, natürlich wieder herstellen.
Dazu dacht ich, ich zähl einfach die noch vorhandenen Unterpunkte und schreib die Nummerierung der Unterpunkte neu.

Wenn das natürlich auf einer einfachere Weise gehen würde, wär ich sehr gern bereit Vorschläge anzuhnehmen ;-)!!


Narses - Di 03.03.09 14:29

Moin!

Hm, erschöpfend war die Erklärung jetzt nicht, aber vielleicht hilft dir das hier: :?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  var
    i,cnt: Integer;
begin
  cnt := 0;
  for i := 0 to TreeView1.Items.Count-1 do // alle Knoten
    if (NOT TreeView1.Items.Item[i].HasChildren) then // keine Kinder = Blatt
      Inc(cnt);
  ShowMessageFmt('%d Blätter gefunden.',[cnt]);
cu
Narses


Krefti - Di 03.03.09 14:43

danke für deine mühe, ich schaus mir gleich an..

Inwiefern nicht genügend erklärt??

also ich möchte ja nur diese Punkte zählen, die ich auf der aller untersten Ebene angelegt habe.

Hab jetzt mal einen Screenshot angehängt, vielleicht erklärt das mein Anliegen eher.

Die Punkte unter Streckenbeschreibung und Flugbewegungsangaben habe ich mittels des hinzufügen Buttons erzeugt. Wenn ich jetzt z.b.Streckenbeschreibung selektierte wird der Bearbeiten und Löschen Button aktiv. Wenn ich Streckenbeschreibung0 lösche, möchte ich, dass Streckenbeschreibung1 zu Streckenbeschreibung0 wird.

Ich hab mir gedacht, dass ich die vorhandenen Punkte einfach zählen kann und die dann neu durchnummeriere anhand des Zählergebnisses.

Unter den anderen Punkten Streckenbeschreibung/Flugbewegungsangaben könnten auch x-beliebig viele Einträge angelegt und anschließend wieder gelöscht und editiert werden.


Narses - Di 03.03.09 14:59

Moin!

user profile iconKrefti hat folgendes geschrieben Zum zitierten Posting springen:
also ich möchte ja nur diese Punkte zählen, die ich auf der aller untersten Ebene angelegt habe.

Hab jetzt mal einen Screenshot angehängt, vielleicht erklärt das mein Anliegen eher.
Jup, das tut es. ;) Es war noch nicht klar, ob jeder Zweig für sich gerechnet werden soll. :idea:

In diesem Fall wäre es allerdings besser, so vorzugehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.TreeView1DblClick(Sender: TObject);
  var
    cnt: Integer;
    Node: TTreeNode;
begin
  cnt := 0;
  if Assigned(TreeView1.Selected) and TreeView1.Selected.HasChildren then begin
    Node := TreeView1.Selected.getFirstChild;
    repeat
      Inc(cnt);
      Node := Node.getNextSibling;
    until (Node = NIL);
  end;
  ShowMessageFmt('Der Knoten hat %d Kinder.',[cnt]);
end;
cu
Narses


Krefti - Mi 04.03.09 09:30

Vielen dank dir schon mal!! Generell funktioniert das auch. Nur will er mit dem Code die Kinder von dem zu löschenden Knoten zählen, was ja 0 ist. ich möchte ja die Punkte in der ebene zählen, wo ein Punkt gelöscht wird, um ja dann neu durch zu nummerieren.
Sprich ich hab meine Streckenbeschreibung, davon möchte ich die kinder zählen, von denen ich auch eines löschen möchte.
Ich hoffe mein Problem ist jetzt endgültig nach zu vollziehen.


Narses - Mi 04.03.09 12:28

Moin!

user profile iconKrefti hat folgendes geschrieben Zum zitierten Posting springen:
Nur will er mit dem Code die Kinder von dem zu löschenden Knoten zählen
[...]
ich möchte ja die Punkte in der ebene zählen, wo ein Punkt gelöscht wird
Dann solltest du mal über diese Referenz nachdenken: :think:

Delphi-Quelltext
1:
TreeView1.Selected.Parent                    
cu
Narses


Krefti - Do 05.03.09 10:10

nochmals vielen dank. habs jetzt mit dem treeview.selected.parent hinbekommen:-)!!!