Autor Beitrag
FrankBurian
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 13.02.06 11:40 
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

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 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!
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 13.02.06 13:17 
Schau dir als erstes mal
users.iafrica.com/d/...eeView/TreeView.html an.

Ich habe etwas ähnliches gemacht allerdings waren bei mir die Objekte je Ebene immer verschieden.

Also du brauchst logischerweise eine Schleife, die alle Datensätze hinzufügt.
Ich würde da evtl. das Dataset behalten und mit Filter=ParentID immer nachschauen ob da noch Untereinträge sind.

Mir wurde allerdings gesagt, und das sehe ich auch ein das es besser ist bei einem DB gestützten Treeview die Daten erst abzurufen wenn sie da sind. Dadurch dauert der Start nicht so lange und man kann einfach mit SQL Filtern arbeiten.
FrankBurian Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 13.02.06 15:59 
thx, 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...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
  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;
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 13.02.06 19:43 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
function TMainform.Add2Tree(TreeViewItems:TTreeNodes; Parent_ID, ID: integer; Description): Boolean;
var i : Integer;
    TempNode : TTreeNode;
    Added : boolean;
begin
  Added:= False;
  if Parent_ID = 0 then begin
    TempNode:= TreeViewItems.Add(nil,Description);
    TempNode.Data:= //ja hier wäre ein Zeiger auf den Datensatz angebracht
    Added:= True;
  end else
  begin
    i:=0;
    while (i < TempNode.count) and (Added = False) do begin
      if TempNode.Items[i].Data = <Parent_ID> then begin //Problem, hier müsste Pointer dereferenziert werden
        TempNode:= TreeViewItems.AddChild(TempNode,Description);
        TempNode.Data:= //ja hier wäre ein Zeiger auf den Datensatz angebracht
        Added:=True;
      end else begin
        Added := Add2Tree(TreeViewItems[i], Parent_ID, ID, Description);
      end;
      inc(i);
    end;
  end;
  result:=Added;
end


Ich weiß jetzt aus dem stehgreif nicht ob das hinhaut bzw. wie du das mit dem .DATA in deinem Fall lösen müsstest. Entweder du übergibst der Funktion gleich die Datensätze und zeigst auf den richtigen damit oder du baust ne eigene kleine einspaltiges Array und zeigst da auf den passenden Eintrag...