![]() |
Frage zur TreeView
Hi,
ich will in meiner TreeView erst alle "Hauptknoten" hinzufügen (klappt auch schon) und dann die einzelnen Childs. Die Daten hole ich aus einer MySQL DB. Wenn ich nun die Hauptknoten angelegt habe, wie bekomme ich dann noch eine genaue Zuordnung hin?:gruebel: Bsp: In der einen Tabelle habe ich die Hauptknoten stehen z.b: "Autos" und "Motoräder". In einer anderen Tabelle stehen die Items, die dann als Child eingefügt werden sollen. Diese Tabelle hat auch eine Spalte "GroupID" über die ich dann einen Bezug auf z.B. "Autos" herstelle. Da dies das erste mal ist, wo ich mit einer TreeView arbeite, bin ich da jetzt etwas ratlos. :wall: - Die Delphi-Hilfe brachte mir auch keinen Erfolg. Ich hoffe, mein Anliegen ist verständlich erklärt!? Gruß, |
Re: Frage zur TreeView
Idealerweise hast du Objekte, z.B. auf Basis der Klasse "TAuto". Diese Klasse enthält als Attribut die GruppenID. Das erzeugt Objekt referenzierst du mit in dem Knoten. Ab jetzt musst du nur noch den Knoten mit dem Objekt der entsprechenden GruppenID suchen und an diesem einen neuen Knoten erzeugen über den du z.B. das Objekt "VW Golf 3..." referenzierst.
Oder für quick'n'dirty: Merk dir den AbsoluteIndex bzw. Index von TTreeNode, den du für "Autos" anlegst und hang alle einzelnen Autos an den Knoten mit diesem AbsoluteIndex. ACHTUNG: Eingefügte Knoten verschieben den Index. Gruß Andi |
Re: Frage zur TreeView
es macht mehr sinn, wenn du erst einen hauptgruppenzweig erstellst und dann alle dazugehörigen kindknoten.... dann den zweiten hauptgruppenzweig etc
|
Re: Frage zur TreeView
Da hat mein Vorgänger definitiv Recht!
Ein Baum schreit förmlich danach den Weg bis zum Leaf durchzugehen. Gruß Andi |
Re: Frage zur TreeView
ich habs mal versucht umzusetzen..
Delphi-Quellcode:
Er setzt zwar die Einträge nach Anzahl der Daten im recordcount, aber er wählt nicht das nächste Obejekt, welches in einer anderen Gruppe stehen würde.
procedure TfrmMain.GetObjects();
var ListItem: TTreeNode; i: integer; AktGroup: Integer; begin lvProjekte.Items.Clear; dsGetObjects.Active:=false; dsGetObjects.CommandText:='select * from objects_tbl'; dsGetObjects.Active:=true; dsGetObjects.First; for i:=0 to dsGetObjects.RecordCount -1 do begin AktGroup:=dsGetObjects.Fields.Fields[1].AsInteger; if dsGetObjects.Fields.Fields[1].AsInteger = AktGroup then begin if dsGetObjects.Fields.Fields[1].AsInteger <> AktGroup then AktGroup:=dsGetProjects.Fields.Fields[1].AsInteger; dsGetGroupID.Active:=false; dsGetGroupID.CommandText:='select bezeichnung from groups_tbl where id= '''+IntToStr(AktGroup)+''''; dsGetGroupID.Active:=true; with lvObjects.Items do begin ListItem := Add(nil, dsGetGroupID.Fields.Fields[0].AsString); AddChild(ListItem, dsGetObjects.Fields.Fields[2].AsString); end; dsGetProjects.Next; end; end; end; |
Re: Frage zur TreeView
überprüfe deinen code nochmal...
Code:
Schritte:
1. hole alle gruppen 2. nimm 1. datensatz aus der gruppe 3. erstelle einen baumknoten gruppe 4. holle alle daten die zur gruppe gehören 5. nimm 1.datensatz aus untergruppe 6. erstelle einen kindknoten zur aktuellen gruppe 7. nächster datensatz aus untergruppe 8. weiter bei 6. solange noch datensätze vorhanden sind 9. nächster datensatz aus gruppe 10. weiter bei 3. solange noch datensätze vorhanden sind |
Re: Frage zur TreeView
Nice!! :lol: - Ich hab mich da jetze mal rangesetzt, da ich gestern noch an nem anderen Projekt weiter arbeiten musste.. es funzt endlich! Dank dir ibp. :thumb:
Delphi-Quellcode:
Gruß,
procedure TfrmMain.GetObjects();
var ListItem: TTreeNode; i, i2: integer; begin lvObjects.Items.Clear; //Alle Gruppenbezeichnungen laden dsGetGroupID.Active:=false; dsGetGroupID.CommandText:='select * from groups_tbl'; dsGetGroupID.Active:=true; //Ersten Datensatz auswählen dsGetGroupID.First; //Baumknoten erstellen - Solange wiederholen, wie Gruppen vorhanden sind for i:=0 to dsGetGroupID.RecordCount -1 do begin with lvObjects.Items do begin ListItem := Add(nil, dsGetGroupID.Fields.Fields[1].AsString); end; //Alle Objekte zur Gruppe laden dsGetObjects.Active:=false; dsGetObjects.CommandText:='select * from Objects_tbl where groupid = '''+dsGetGroupID.Fields.Fields[0].AsString+''''; dsGetObjects.Active:=true; //Erstes Objekt wählen dsGetObjects.First; //Child erstellen - Solange wie Daten vorhanden sind for i2:=0 to dsGetObjects.RecordCount -1 do begin with lvObjects.Items do begin AddChild(ListItem, dsGetObjects.Fields.Fields[2].AsString); end; //Nächstes Objekt wählen dsGetObjects.next; end; //Nächste Gruppe wählen dsGetGroupID.next; end; end; |
Re: Frage zur TreeView
Nun hab ich mal weiter geproggt.. ich bin nun beim einfügen eines neuen Objektes angekommen. Wenn das Objekt eingefügt wurde, wollt ich die Liste neu laden lassen. Jedoch lädt er mir jetzt nur noch die Gruppen und nicht die dazugehörigen Objekte obwohl ich die selbe Prozedur (siehe oben) aufrufe. :gruebel: Kann mir da vielleicht jemand sagen, woran das liegt?
Gruß, |
Re: Frage zur TreeView
warum willst du denn den baum neu laden, wenn er schon vorhanden ist?
|
Re: Frage zur TreeView
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 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