AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treeview rekursiv füllen?

Ein Thema von TriphunEM · begonnen am 13. Feb 2006 · letzter Beitrag vom 14. Feb 2006
Antwort Antwort
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#1

Treeview rekursiv füllen?

  Alt 13. Feb 2006, 11:42
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!
  Mit Zitat antworten Zitat
Sebastian R.

Registriert seit: 12. Feb 2006
94 Beiträge
 
#2

Re: Treeview rekursiv füllen?

  Alt 13. Feb 2006, 13:30
Wikipedia - Rekursion oder Google - Rekursion. Vielleicht kann dir das ein bisschen helfen!

MfG, Sebastian!
Sebastian R.
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#3

Re: Treeview rekursiv füllen?

  Alt 13. Feb 2006, 15:50
was ne rekursion ist und wie sie funktioniert, dass weiß ich.

ich habe bloß probleme mir das vorzustellen...
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#4

Re: Treeview rekursiv füllen?

  Alt 13. Feb 2006, 15:57
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;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Treeview rekursiv füllen?

  Alt 13. Feb 2006, 19:54
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
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#6

Re: Treeview rekursiv füllen?

  Alt 14. Feb 2006, 09:17
thx... hat funktioniert!

wie kann ich den einträgen dann noch den imageindex hinzufügen ????
  Mit Zitat antworten Zitat
Benutzerbild von ibp
ibp

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#7

Re: Treeview rekursiv füllen?

  Alt 14. Feb 2006, 10:56
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:=___;
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#8

Re: Treeview rekursiv füllen?

  Alt 14. Feb 2006, 11:31
thx,

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

Registriert seit: 31. Mär 2004
Ort: Frankfurt am Main
1.511 Beiträge
 
Delphi 7 Architect
 
#9

Re: Treeview rekursiv füllen?

  Alt 14. Feb 2006, 11:35
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!
grudsätzlich gilt hier, erst recherchieren ob es einen beitrag dergleichen schon gibt, wenn nicht für jede neue frage einen neuen beitrag erstellen!
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#10

Re: Treeview rekursiv füllen?

  Alt 14. Feb 2006, 12:48
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 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