Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Treeview rekursiv füllen? (https://www.delphipraxis.net/63043-treeview-rekursiv-fuellen.html)

TriphunEM 13. Feb 2006 10:42


Treeview rekursiv füllen?
 
Hallo Leute,

ich habe folgendes Problem. Ich habe immer Probleme mit dem Verständnis von Rekursionen, deshalb hoffe ich mir kann jemand von euch helfen! Und von Treeviews ansich habe ich bis jetzt auch noch keine erfahrung!

Ich hole Daten aus einer Datenbank, schreib Sie in ein Array, und will sie dann in einem Treeview darstellen.

Dabei lesen ich 3 Parameter ID, PARENT_ID und DESCRIPTION.

Ist PARENT_ID = 0 dann soll der Eintrag auf der Root-Ebene sein, ansonsten hat der Eintrag dann den ELTERN Eintrag von der entsprechenden ID.

in dem array sieht das dann so aus

Delphi-Quellcode:
 db = record
    id,
    parent_id : integer;
    description : string;
  end;

var
  arr_data : array[0..10] of db;
bsp.

Ich bekomme aus der Datenbank:

id,parent_id,description
---
1,0,Test 1
2,0,Test 2
3,1,UnterTest 1
4,3,UnterTest 2

und so soll als im Treeview dann aussehen:

+Test 1
-+Untertest 1
--+UnterTest 2
+Test 2

Kann mir jemand weiterhelfen???

Danke!

Sebastian R. 13. Feb 2006 12:30

Re: Treeview rekursiv füllen?
 
Wikipedia - Rekursion oder Google - Rekursion. Vielleicht kann dir das ein bisschen helfen!

MfG, Sebastian!

TriphunEM 13. Feb 2006 14:50

Re: Treeview rekursiv füllen?
 
was ne rekursion ist und wie sie funktioniert, dass weiß ich.

ich habe bloß probleme mir das vorzustellen...

TriphunEM 13. Feb 2006 14:57

Re: Treeview rekursiv füllen?
 
ich hab den code um die daten in ein mainmenü zu schreiben.

allerdings bekomm ich das nicht hin, es für ein treeview umzuschreiben!
kann mir da einer weiterhelfen...

Delphi-Quellcode:

  for i:=1 to datacount do
    Array2Toolbar(Mainmenu.Items, arr_data[i].parent_id, arr_data[i].id, arr_data[i].desc);


function TMainform.Add2Menu(Menu:TMenuItem; Parent_ID, ID: integer; Description): Boolean;
var i : Integer;
    TempMenu : TMenuItem;
    Added : boolean;
begin
  Added:= False;
  if Parent_ID = 0 then begin
    TempMenu:= TMenuItem.Create(Menu);
    TempMenu.Caption:= Description;
    Tempmenu.Tag:= ID;
    Menu.Add(TempMenu);
    Added:= True;
  end else
  begin
    i:=0;
    while (i < Menu.count) and (Added = False) do begin
      if Menu.Items[i].Tag = Parent_ID then begin
        TempMenu:= TMenuItem.Create(Menu);
        TempMenu.Caption:= Description;
        TempMenu.Tag:= ID;
        Menu.Items[i].Add(TempMenu);
        Added:=True;
      end else begin
        Added := Add2Menu(Menu.items[i], Parent_ID, ID, Description);
      end;
      inc(i);
    end;
  end;
  result:=Added;
end;

omata 13. Feb 2006 18:54

Re: Treeview rekursiv füllen?
 
Vielleicht so...

Delphi-Quellcode:
procedure ArrayToBaum(Tree:TTreeView; arr_data: TMyArray);
var Node:TTreeNode;
    i, j:integer;
    abbruch:boolean;
begin
  for i:=low(arr_data) to high(arr_data) do begin
    if arr_data[i].parent_id = 0 then begin
      Tree.Items.AddChildObject(
        nil,
        arr_data[i].description,
        TObject(arr_data[i].id)
      );
    end
    else begin
      Node:=nil;
      abbruch:=false;
      j:=0;
      while (j < Tree.Items.Count) and not abbruch do begin
        if INTEGER(Tree.Items[j].Data) = arr_data[i].parent_id then begin
          abbruch:=true;
          Node:=Tree.Items[j];
        end;
        inc(j);
      end;
      if abbruch then
        Tree.Items.AddChildObject(
          Node,
          arr_data[i].description,
          TObject(arr_data[i].id)
        );
    end;
  end;
end;
MfG
Thorsten

TriphunEM 14. Feb 2006 08:17

Re: Treeview rekursiv füllen?
 
thx... hat funktioniert!

wie kann ich den einträgen dann noch den imageindex hinzufügen ????

ibp 14. Feb 2006 09:56

Re: Treeview rekursiv füllen?
 
du solltest dir gedanken über die sortierung machen, damit kann man vieles einfacher gestalten. wenn du die daten aus der db sortierst nach parentid,id dann kann man das ganze optimieren, da du nicht immer wieder den ganzen baum durchsuchen musst...


Delphi-Quellcode:
anode:= tree.Items.AddChildObject(...);
anode.imageindex:=___;

TriphunEM 14. Feb 2006 10:31

Re: Treeview rekursiv füllen?
 
thx,

was mit jetzt nur noch fehl ist die eigenschaft "tag" und "hint" wäre auch nicht schlecht, bloß das scheint zu fehlen!!!

ibp 14. Feb 2006 10:35

Re: Treeview rekursiv füllen?
 
es gibt eine tolle hilfe in delphi "F1" das schau mal unter ttreeview/ttreenode nach :!:
ansonsten kann ich dir auch die suche hier im forum empfehlen! :thumb:
grudsätzlich gilt hier, erst recherchieren ob es einen beitrag dergleichen schon gibt, wenn nicht für jede neue frage einen neuen beitrag erstellen!

TriphunEM 14. Feb 2006 11:48

Re: Treeview rekursiv füllen?
 
jo hab ich auch, aber ich komm mit dem DATA und Pointer nicht klar...

ich bekomm nur die Root-Ebene angezeigt, die Unterordner fehlen jedoch :

Weiß jemand woran es liegen kann???

Delphi-Quellcode:
procedure TMainform.Array2Treeview(Tree:TTreeView; folder:boolean);
var node,anode : TTreeNode;
    i, j : integer;
    chancel : boolean;
    P : PTBookmark;
begin
  //PTBookmarkTreeView1.Selected.Data)^.ID;
  for i := 1 to datacount do begin
    New(P);
    P.id := arr_data[i].id;
    P.parent_id := arr_data[i].parent_id;
    P.flag := arr_data[i].flag;
    P.position := arr_data[i].position;
    P.desc := arr_data[i].desc;
    P.url := arr_data[i].url;

    if arr_data[i].parent_id = 0 then begin
      Tree.Items.AddChildObject(nil, arr_data[i].desc, P);
    end
    else begin
      Node := nil;
      chancel := false;
      j := 0;
      while (j < Tree.Items.Count) and not chancel do begin
        if INTEGER(Tree.Items[j].Data) = arr_data[i].parent_id then begin
          chancel := true;
          Node := Tree.Items[j];
        end;
        inc(j);
      end;
      if chancel then
        Tree.Items.AddChildObject(Node, arr_data[i].desc, P);
    end;

  end;
end;


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