![]() |
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:
bsp.
db = record
id, parent_id : integer; description : string; end; var arr_data : array[0..10] of db; 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! |
Re: Treeview rekursiv füllen?
![]() ![]() MfG, Sebastian! |
Re: Treeview rekursiv füllen?
was ne rekursion ist und wie sie funktioniert, dass weiß ich.
ich habe bloß probleme mir das vorzustellen... |
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; |
Re: Treeview rekursiv füllen?
Vielleicht so...
Delphi-Quellcode:
MfG
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; Thorsten |
Re: Treeview rekursiv füllen?
thx... hat funktioniert!
wie kann ich den einträgen dann noch den imageindex hinzufügen ???? |
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:=___; |
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!!! |
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! |
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 22:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz