Delphi-PRAXiS

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 Hilfe im Umgang mit TreeView (https://www.delphipraxis.net/67518-hilfe-im-umgang-mit-treeview.html)

Kanne_Kaffe 15. Apr 2006 22:18


Hilfe im Umgang mit TreeView
 
Hallo,

Habe eine TreeView die ungefähr so aussieht

+ Haupteintrag A
- Bla 1
- Bla 2
- Bla 3
+ Haupteintrag B
- Bla 1
- Bla 2
- Bla 3
+ Haupteintrag C
- Bla 1
- Bla 2
- Bla 3

Jetzt möchte ich erreichen, das die Haupt-Noden mit den Unter-Noden aufgelistet werden:
Haupteintrag A Bla 1
Haupteintrag A Bla 2
Haupteintrag A Bla 3
Haupteintrag B Bla 1
Haupteintrag B Bla 2
Haupteintrag B Bla 3
Haupteintrag C Bla 1

Ich bekomme das mit einer Schleife nicht irgendwie nicht hin weil, TreeView.Items.Count alle Einträge des TreeView
greifen so das ich so am Ende "Doppel-Moppel". Is doof zuerklären...

Delphi-Quellcode:
  for I := 0 to TreeView1.Items.Count-1 do
    Memo1.Lines.Add(TreeView1.Items.Item[I].Text)
Erzeugt folgende Ausgabe

Haupteintrag A
Bla 1
Bla 2
Bla 3


Ich hoffe jemand versteht und erkennt das Problem :lol:

Matze 15. Apr 2006 22:34

Re: Hilfe im Umgang mit TreeView
 
Hi,

mithilfe dieser Beiträge und Links müsstest du dir eine Funktion zusammenbasteln können. ;)

JasonDX 15. Apr 2006 22:50

Re: Hilfe im Umgang mit TreeView
 
Ich hoffe mal, das Problem richtig verstanden zu haben.
In dem Fall moechtest du nur die Blaetter des Baumes zurueckgeben, aber mit der "Wegbeschreibung" dorthin.
An sich ist das nicht schwer. Um dich mal auf den Weg dorthin zu bringen:
du hast bisher das:
Zitat:

Zitat von Kanne_Kaffe
Delphi-Quellcode:
  for I := 0 to TreeView1.Items.Count-1 do
    Memo1.Lines.Add(TreeView1.Items.Item[I].Text)

Um nur die Blaetter in die Liste zu kriegen fragst du einfach, wieviele Kinder der aktuelle Knoten hat. Die Eigenschaft Delphi-Referenz durchsuchenCount duerfte da hilfreich sein.
Wenn also Count = 0 ist, dann ab mit dem Knoten in die Liste, ansonsten passiert eben nichts.
So, und wie kriegt man jetzt den Ursprungsknoten: Der steht in Parent drinnen. Also kurz gesagt:
Code:
Fuer jedes Item:
  Wenn keine Kinder vorhanden, dann:
    Fuege der Liste Hinzu: 'Haupteintrag ' + <item.parent.text> + ' Bla ' + <item.text>
Allerdings funktioniert das nur, wenn der Baum max. Hoehe 2 hat. Und damit du keine Exception kriegst, wenn mal ein Node auf Level 0 keine Kinder hat, solltest du noch ueberpruefen, ob das Parent vom Item nil ist.
Wenn der Baum auch tiefer geht, dann wirds etwas komplizierter, aber es bleibt machbar :zwinker:

greetz
Mike

[Add] Ich hab Matze's Beitrag zwar gesehn, wollts aber nicht umsonst geschrieben ham :P ;)

Kanne_Kaffe 15. Apr 2006 23:08

Re: Hilfe im Umgang mit TreeView
 
Danke. Habe es grad allein hinbekommen.
Delphi-Quellcode:
var
  I, X: Integer;
  S: String;
begin
  for I := 0 to TreeView1.Items.Count-1 do
    if TreeView1.Items.Item[I].Parent = nil then
      S := TreeView1.Items.Item[I].Text
      else
      Memo1.Lines.Add(S + ' ' + TreeView1.Items.Item[I].Text);
end;
5 Minuten später:
// Edit: Naja dann doch nicht ganz.... da ja jetzte einige Hauptnoden übersprungen werden

marabu 16. Apr 2006 06:32

Re: Hilfe im Umgang mit TreeView
 
Guten Morgen.

Bei mir funktioniert es so:

Delphi-Quellcode:
procedure GetLeaves(tn: TTreeNode; sLeaves, sParents: TStrings);
var
  tnChild: TTreeNode;
begin
  if Assigned(sParents) then
    sParents.Add(tn.Text);
  if tn.HasChildren then
  begin
    tnChild := tn.getFirstChild;
    while Assigned(tnChild) do
    begin
      GetLeaves(tnChild, sLeaves, sParents);
      tnChild := tnChild.getNextSibling;
    end;
  end else
  if Assigned(sParents)
    then sLeaves.Add(sParents.DelimitedText)
    else sLeaves.Add(tn.Text);
  sParents.Delete(Pred(sParents.Count));
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  i: Integer;
  tn: TTreeNode;
  sParents: TStrings;
begin
  Memo.Clear;
  Memo.Lines.BeginUpdate;
  tn := TreeView.Items.GetFirstNode;
  sParents := TStringList.Create;
  sParents.Delimiter := '\';
  while Assigned(tn) do
  begin
    GetLeaves(tn, Memo.Lines, sParents);
    tn := tn.getNextSibling;
  end;
  sParents.Free;
  Memo.Lines.EndUpdate;
end;
Frohe Ostern

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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