AGB  ·  Datenschutz  ·  Impressum  







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

Treeview

Ein Thema von roland9999 · begonnen am 9. Mär 2012 · letzter Beitrag vom 13. Mär 2012
Antwort Antwort
Seite 1 von 2  1 2      
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#1

Treeview

  Alt 9. Mär 2012, 11:22
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
Miniaturansicht angehängter Grafiken
treeview1.jpg  
Roland
  Mit Zitat antworten Zitat
_BlackDragon_

Registriert seit: 4. Dez 2007
Ort: Eschweiler
64 Beiträge
 
#2

AW: Treeview

  Alt 9. Mär 2012, 16:23
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.

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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Treeview

  Alt 9. Mär 2012, 16:41
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)
Andreas
  Mit Zitat antworten Zitat
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Treeview

  Alt 9. Mär 2012, 16:59
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
Roland
  Mit Zitat antworten Zitat
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie

  Alt 10. Mär 2012, 14:26
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
Miniaturansicht angehängter Grafiken
treeview2.jpg  
Roland
  Mit Zitat antworten Zitat
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie

  Alt 12. Mär 2012, 08:07
Hallo zusammen,

hat niemand eine Idee?

LG

Roland
Roland
  Mit Zitat antworten Zitat
omata

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

AW: Treeview 1. Hauptnode doppelt und falsche Unterkategorie

  Alt 12. Mär 2012, 11:56
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...

Geändert von omata (12. Mär 2012 um 13:47 Uhr)
  Mit Zitat antworten Zitat
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Treeview

  Alt 12. Mär 2012, 17:20
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
Roland
  Mit Zitat antworten Zitat
omata

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

AW: Treeview

  Alt 12. Mär 2012, 21:09
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.
  Mit Zitat antworten Zitat
roland9999

Registriert seit: 4. Mär 2012
23 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Treeview

  Alt 13. Mär 2012, 12:40
Hallo omata,

Ich habe es heute ausprobiert.
Es hat wunderbar funktioniert.
Ich bedanke mich bei dir, für deine Unterstützung.

LG
Roland

Geändert von roland9999 (13. Mär 2012 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:47 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