Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Treeview (https://www.delphipraxis.net/167014-treeview.html)

roland9999 9. Mär 2012 10:22

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:
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;
Für die Hilfe bedanke ich mich.

LG
Roland

_BlackDragon_ 9. Mär 2012 15:23

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:

{ 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;
Das Problem bei dir ist, du lädst erst die "Haupt"-Kategorien und wenn diese durch sind die Unterkategorien.

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.

shmia 9. Mär 2012 15:41

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:
//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;
3.) schlechte Namensgebung (q1, q2, q3,q4, MyTreenode1)

roland9999 9. Mär 2012 15:59

AW: Treeview
 
Hallo

vielen Dank für die Tipps.

Zitat:

1.) SQL - Anweisungen kann man doch schon im Objektinspektor zuweisen.
Es ist nicht nötig dies immer wieder im Code zu tun.
Ich weiß, da ist eine schlechte Angewohnheit von mir. Der Quelltext ist dadurch ein wenig unübersichtlich.

Zitat:

3.) schlechte Namensgebung (q1, q2, q3,q4, MyTreenode1)
Ich probiere es nur aus. Nachher im eigentlichen Programm werde ich entsprechene Bezichnungen nutzen.

Eure Tipps werde ich jetzt in Ruhe ausprobieren.

Wenn's nicht klappt, melde ich mich wieder.

LG
Roland

roland9999 10. Mär 2012 13:26

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:
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;
Vielleicht hat ja jemand einen Tipp was ich da falsch mache.

LG

ROland

roland9999 12. Mär 2012 07:07

AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie
 
Hallo zusammen,

hat niemand eine Idee?:(

LG

Roland

omata 12. Mär 2012 10:56

AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie
 
Zitat:

Zitat von roland9999 (Beitrag 1156083)
hat niemand eine Idee?:(

Ideen schon. Nur darf man hier ja keine konkreten Beispiele mehr veröffentlichen. Da wird es schwer, dir zu helfen. Welche Datenbankkomponenten verwendest du eigentlich und wie sieht deine Datenbankstruktur aus?

Aus dem Kopf...
Delphi-Quellcode:
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;
(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 hier

Sorry, aber das musste mal raus...

roland9999 12. Mär 2012 16:20

AW: Treeview
 
Hallo
Zitat:

Welche Datenbankkomponenten verwendest du
Ich benutze dbExpress

Zitat:

Datenbankstruktur
Die erste Tabelle beinhaltet die Spalten category_id und category_name
Die zweite Tabelle beinhaltet die Spalten category_parent_id und category_child_id

Gruß

Roland

omata 12. Mär 2012 20:09

AW: Treeview
 
Vielleicht hilft dir das hier ja weiter...
Delphi-Quellcode:
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;
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.

roland9999 13. Mär 2012 11:40

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.
Seite 1 von 2  1 2      

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