![]() |
Treeview
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich sehe bzw. erkenne den Fehler nicht. Auf dem Bild könnt ihr das Ergebnis sehen. Die Hauptkategorien werden richtig angezeigt. Die ersten beiden Unterkategorien "Testkategorie und Testkategorie 2" in der Hauptkategorie Madonnen, sind auch richtig. Alle weiteren Unterkategorien stehen an der falschen Stelle. Die sollten eigentlich unter der dazugehörigen Hauptkategorie stehen. Ich vermute, dass es an der markierten Stelle liegt. Vielleicht hat jemand eine Idee. Hier der Quelltext.
Delphi-Quellcode:
Für die Hilfe bedanke ich mich.
procedure Tf_treeview.Button1Click(Sender: TObject);
var MyTreeNode1 : TTreeNode; begin with tv.Items do begin clear; q2.Close; //1.Hauptkategorie q2.SQL.Clear; q2.SQL.Add('select category_child_id from jos_vm_category_xref '); q2.SQL.Add('where category_parent_id = 0'); q2.Open; //Liefert den Namen der Kategorie q1.Close; q1.SQL.Clear; q1.SQL.Add('select category_name from jos_vm_category '); q1.SQL.Add('where category_id = :category_id'); q1.parambyname('category_id').AsInteger := q2.FieldByName('category_child_id').AsInteger; q1.Open; //---------------------------------------------------------------------------------------- //Eintrag in Treeview MyTreeNode1 := Add(nil, q1.FieldByName('category_name').AsString); //Unterkategorien der ersten Hauptkategorie q3.Close; q3.SQL.Clear; q3.SQL.Add('select category_child_id from jos_vm_category_xref '); q3.SQL.Add('where category_parent_id = :category_parent_id'); q3.ParamByName('category_parent_id').AsInteger := q2.FieldByName('category_child_id').AsInteger; q3.open; while not q3.eof do begin //Liefert den Namen der Kategorie q4.Close; q4.SQL.Clear; q4.SQL.Add('select category_name from jos_vm_category '); q4.SQL.Add('where category_id = :category_id'); q4.parambyname('category_id').AsInteger := q3.FieldByName('category_child_id').AsInteger; q4.Open; //Eintrag der Unterkategorien in die TreeView AddChild(MyTreeNode1, q4.FieldByName('category_name').AsString); q3.Next; end; //-------------------------------- q2.Next; //Liefert weitere Hauptkategorien und Unterkategorien while not q2.Eof do begin //Weitere Hauptkategorien in der TreeView anzeigen q1.Close; q1.SQL.Clear; q1.SQL.Add('select category_name from jos_vm_category '); q1.SQL.Add('where category_id = :category_id'); q1.parambyname('category_id').AsInteger := q2.FieldByName('category_child_id').AsInteger; q1.Open; Add(MyTreeNode1, q1.FieldByName('category_name').AsString); //------------------------------------------------------------- //Unterkategorien der weiteren Hauptkategorien in Treeview anzeigen q3.Close; q3.SQL.Clear; q3.SQL.Add('select category_child_id from jos_vm_category_xref '); q3.SQL.Add('where category_parent_id = :category_parent_id'); q3.ParamByName('category_parent_id').AsInteger := q2.FieldByName('category_child_id').AsInteger; q3.open; while not q3.eof do begin //Liefert den Namen der Kategorie q4.Close; q4.SQL.Clear; q4.SQL.Add('select category_name from jos_vm_category '); q4.SQL.Add('where category_id = :category_id'); q4.parambyname('category_id').AsInteger := q3.FieldByName('category_child_id').AsInteger; q4.Open; //Eintrag der Unterkategorie in die TreeView [COLOR="Red"]AddChild(MyTreeNode1, q4.FieldByName('category_name').AsString);[/COLOR] q3.Next; end; q2.Next; end; end; end; LG Roland |
AW: Treeview
Hi erstmal,
wenn ich das richtig verstanden habe und so wie es aussieht, fügst du sämtliche Knoten immer als Unterknoten von "MyTreeNode1" hinzu. Du müsstest, wenn du Unterkategorien hast, diese einem Knoten der Hauptkategorie unterordnen. Pseudo-Code:
Delphi-Quellcode:
Das Problem bei dir ist, du lädst erst die "Haupt"-Kategorien und wenn diese durch sind die Unterkategorien.{ Hauptkategorie } for iCat := 0 to Categories.Count-1 do begin tnCat := TreeView.Add(nil,Categories[iCat].Name); { Jeweilige Unterkategorien der aktuellen Kategorie unterordnen } for iSubCat := 0 to Categories[iCat].SubCategories.Count-1 do begin tnSubCat := TreeView.Add(tnCat,Categories[iCat].SubCategories[iSubCat].Name); end; end; Vlt. hat das ja schon etwas geholfen, ansonsten einfach nochmal nachhaken. :wink: Gruß Olli PS: Wenn du nicht vorher weißt, wieviele Unterkategorien es gibt (also wie tief die Baumstruktur ist), wirst du um Rekursion nicht drumherum kommen. |
AW: Treeview
Dein Code hat ein paar Schwachstellen:
1.) SQL - Anweisungen kann man doch schon im Objektinspektor zuweisen. Es ist nicht nötig dies immer wieder im Code zu tun. 2.) du verwendest keinerlei Unterfunktionen Dabei kann das so nützlich sein:
Delphi-Quellcode:
3.) schlechte Namensgebung (q1, q2, q3,q4, MyTreenode1)
//Liefert den Namen der Kategorie
function Tf_treeview.GetCategoryName(cat_id:integer):string; begin q4.Close; // q4.SQL.Clear; // q4.SQL.Add('select category_name from jos_vm_category '); // q4.SQL.Add('where category_id = :category_id'); q4.parambyname('category_id').AsInteger := cat_id; q4.Open; if not q4.IsEmpty then Result := q4.FieldByName('category_name').AsString else Result := ''; end; |
AW: Treeview
Hallo
vielen Dank für die Tipps. Zitat:
Zitat:
Eure Tipps werde ich jetzt in Ruhe ausprobieren. Wenn's nicht klappt, melde ich mich wieder. LG Roland |
AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe nun ein wenig gebastelt und habe die Treeview auch fast hinbekommen. Ein Schönheitsfehler ist aber vorhanden. Siehe Bild Der gerahmte Bereich ist doppelt und die Unterkategorie stimmt nicht. Alle anderen Positionen stimmen. Hier der Quelltext:
Delphi-Quellcode:
Vielleicht hat ja jemand einen Tipp was ich da falsch mache.
procedure Tf_treeview.Button1Click(Sender: TObject);
var MyTreeNode1 : TTreeNode; icat : integer; begin with tv.Items do begin clear; // 1. Hauptnode mit CHildnode setzen-------------------------------------------------------------- q_hauptkategorien.Close; //1.Hauptkategorie q_hauptkategorien.Open; //Liefert den Namen der Kategorie über Funktion GetCategoryName GetCategoryName(q_hauptkategorien.FieldByName('category_child_id').AsInteger); //---------------------------------------------------------------------------------------- //Eintrag in Treeview mytreenode1 := Add(nil, q_kategorie_name.FieldByName('category_name').AsString); //Unterkategorien der ersten Hauptkategorie q_unterkategorien.Close; q_unterkategorien.ParamByName('category_parent_id').AsInteger := q_hauptkategorien.FieldByName('category_child_id').AsInteger; q_unterkategorien.open; while not q_unterkategorien.eof do begin //Liefert den Namen der Kategorie q_kategorie_name.Close; q_kategorie_name.parambyname('category_id').AsInteger := q_unterkategorien.FieldByName('category_child_id').AsInteger; q_kategorie_name.Open; //Eintrag der Unterkategorien in die TreeView AddChild(mytreenode1, q_kategorie_name.FieldByName('category_name').AsString); q_unterkategorien.Next; end; //-----------------------------------------------------------------------------------------------} for icat := 1 to Count - 1 do begin //Liefert weitere Hauptkategorien und Unterkategorien while not q_hauptkategorien.Eof do begin //Weitere Hauptkategorien in der TreeView anzeigen q_kategorie_name.Close; q_kategorie_name.parambyname('category_id').AsInteger := q_hauptkategorien.FieldByName('category_child_id').AsInteger; q_kategorie_name.Open; Item[icat].Text := q_kategorie_name.FieldByName('category_name').AsString; mytreenode1 := Add(nil,item[icat].Text ); //------------------------------------------------------------- //Unterkategorien der weiteren Hauptkategorien in Treeview anzeigen q_unterkategorien.Close; q_unterkategorien.ParamByName('category_parent_id').AsInteger := q_hauptkategorien.FieldByName('category_child_id').AsInteger; q_unterkategorien.open; //Liefert den Namen der Kategorie while not q_unterkategorien.Eof do begin q_kategorie_name.Close; q_kategorie_name.parambyname('category_id').AsInteger := q_unterkategorien.FieldByName('category_child_id').AsInteger; q_kategorie_name.Open; //Eintrag der Unterkategorie in die TreeView AddChild(mytreenode1, q_kategorie_name.FieldByName('category_name').AsString); q_unterkategorien.Next; end; q_hauptkategorien.Next; end; end; end; end; LG ROland |
AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie
Hallo zusammen,
hat niemand eine Idee?:( LG Roland |
AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie
Zitat:
Aus dem Kopf...
Delphi-Quellcode:
(1) bedanke dich dafür bei vagtler (vielleicht hilft er dir ja, aber dann müsste er sich ja an seine eigenen Regeln halten und dazu hat er vermutlich selbst keine Lust). Siehe auch
procedure LoadTree(ATree:TTreeView; AConnection:TZConnection);
procedure LoadSubTree(id:integer; Parent:TTreeNode); begin // hier den richtigen Code einfügen und schon geht es (1) end; begin ATree.Items.Clear; LoadSubTree(0, nil); end; ![]() Sorry, aber das musste mal raus... |
AW: Treeview
Hallo
Zitat:
Zitat:
Die zweite Tabelle beinhaltet die Spalten category_parent_id und category_child_id Gruß Roland |
AW: Treeview
Vielleicht hilft dir das hier ja weiter...
Delphi-Quellcode:
Und ich habe mich jetzt entschieden, das mir ein Geblubber von z.B. vagtler scheiss egal ist. Ich werde jetzt weiterhin Menschen, die hier Fragen stellen, helfen und lasse mich nicht weiter ausbremsen, von irgendwelchen Besserwissern und Schlaubergern.
procedure LoadTree(ATree:TTreeView; ASQLConnection:TSQLConnection);
procedure LoadSubTree(id:integer; Parent:TTreeNode); var SDS:TSimpleDataSet; Node:TTreeNode; begin SDS:=TSimpleDataSet.Create(nil); try SDS.Connection:=ASQLConnection; SDS.DataSet.CommandText:= 'SELECT x.category_child_id, category_name'#13 + 'FROM jos_vm_category_xref x'#13 + 'INNER JOIN jos_vm_category c'#13 + ' ON x.category_child_id = c.category_id'#13 + 'WHERE x.category_parent_id = :id'; SDS.DataSet.ParamByName('id').AsInteger:=id; SDS.Open; while not SDS.Eof do begin Node := ATree.Items.AddChild( Parent, SDS.FieldByName('category_name').AsString ); LoadSubTree(SDS.FieldByName('category_child_id').AsInteger, Node); SDS.Next; end; SDS.Close; finally SDS.free; end; end; begin ATree.Items.Clear; LoadSubTree(0, nil); end; |
AW: Treeview
Hallo omata,
Ich habe es heute ausprobiert. Es hat wunderbar funktioniert. Ich bedanke mich bei dir, für deine Unterstützung. :-D LG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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