Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TreeView - Child vom Child (https://www.delphipraxis.net/30962-treeview-child-vom-child.html)

Tyler 1. Okt 2004 19:41


TreeView - Child vom Child
 
Holla,

das einzig gute Tutorial zu TreeViews ist leider englisch, und das erschwert das Verständnis ungemein.

Also folgende Frage:

In einer DB lege ich verschieden Kategorien ab, die jeweils für sich Unterkategorien und diese wieder Unter-Kategorien.

Nun will ich das ganze "visualisieren"; in einem TreeView.

Das erstellen der obersten Oberkategorien, die Childs vom Rootnode, gelingt noch ganz gut.

Dann will ich aber zu den jeweiligen 1. Childs deren Childs addieren. Zu dem Zweck folgende Schleife:

Delphi-Quellcode:
 for i := 1 to Kategorien.Count do
  begin
    // ZUERST schau ich, ob in der DB für das 1. Child überhaupt "untere" Childs existieren
    // Das Feld Kategorie ist hierbei so aufgebaut:
    // 10 Stellen, je zwei Stellen für eine Ebene, von links beginnend
    // 0100000000 entspricht also dem ersten, obersten Node
    // 0101000000 wäre dann das 1. Child des ersten, obersten Node
    // 0102000000 ist das 2. Child
    // 0200000000 ist das 2. Child vom RootNode
    // mit dem folgenden SQL-Script finde ich also nacheinander alle Childs alle oberen Nodes
    q_Kategorien.SQL.Text := 'SELECT * FROM kategorien WHERE ' +
      'kategorie LIKE "' + StrToInt(i) + '%"';
    q_Kategorien.Open;
  end;

Nun steh ich vor dem Problem: Wie wähle ich jetzt das erste Child des Rootnodes in der TreeView selber aus.
Wenn das klar ist, kann ich dem schonmal ein weiteres Child zufügen.


Und dann die zweite Frage:

Ist das ganze sinnvoll, oder hab ich mich da ein bissel verzettel. Die maxmiale Tiefe entspricht ja 4 Ebenen. Ich müsste also 4 for-to-Schleifen ineinander verschachteln, um die TreeView zu füllen. Ist das auf performance-technischer Sicht sinnvoll, vertretbar?

Danke euch im Vorraus

tyler

Tyler 2. Okt 2004 10:04

Re: TreeView - Child vom Child
 
*freu*

Ich habs selber, nachdem ich grübelnd eingeschlafen bin, heute morgen mir den Kopf über einer Schüssel Cornflakes zerbrochen hab, und beinahe wahnsinnig geworden bin, kam folgender Algo raus:

Delphi-Quellcode:
var
  i,j,k : Integer;
  vSub1 : Array of String;
begin
  q_Kategorien.SQL.Text := 'SELECT * FROM kategorien WHERE kat2 = 0';
  q_Kategorien.Open;
  q_Kategorien.First;

  j := q_Kategorien.RecordCount;
  SetLength(vSub1, j + 1);

  for i := 1 to j do
  begin
    vSub1[i] := q_Kategorien.FieldValues['kat1'];
    q_Kategorien.Next;
    Memo1.Lines.Add(vSub1[i]);
  end;

  i := 1;
  repeat
    q_Kategorien.SQL.Text := 'SELECT * FROM kategorien WHERE kat1 = ' +
      vSub1[i] + ' ORDER BY kat1, kat2';
    q_Kategorien.Open;
    if q_Kategorien.RecordCount = 1 then
    begin
      nSub1 := tv_Kategorien.Items.AddChild(nMain, q_Kategorien.FieldValues['bezeichnung']);
      Inc(i,1);
    end else begin
      nSub1 := tv_Kategorien.Items.AddChild(nMain, q_Kategorien.FieldValues['bezeichnung']);
      q_Kategorien.Next;
      Inc(i,1);
      for k := 1 to q_Kategorien.RecordCount - 1 do
      begin
        nSub2 := tv_Kategorien.Items.AddChild(nSub1, q_Kategorien.FieldValues['bezeichnung']);
        q_Kategorien.Next;
      end; // FOR K TO RECCOUNT - 1
    end; // IF RECCOUNT = 1
  until i = j + 1 // REPEAT UNTIL I = J
Das einzige ist: Ich musste die DB-Struktur ändern. Es gibt jetzt 3 Integer-Felder:
kat1, kat2, kat3.
Diese beinhalten für sich die Zahl der Kategorie. Kat3 ist erstmal noch ungenutzt, da das einbinden einer 3. Ebene mich erstmal überfordert - da warte ich auf ne kreative Phase im Laufe des WE *g*

Danke für eure geschätzte Aufmerksamkeit :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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