Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 07:27
Ganz einfach: Deine DB ist völlig korrekt. Die Spalte ID ist ein AutoInc-Wert (z.B.) Hauptsache eindeutig und wird sich nie ändern (Wie Sir Thornberry erwähnte). Die Spalte ID hat Nichts mit dem Index in der Items-Eigenschaft zu tun.

Den ID-Wert speicherst Du (z.B.) in der Tag-Property eines TTreeNode. Oder du erzeugst eine Klasse, die die DB-Informationen enhält und speicherst den Instanzenzeiger in der Data-Eigenschaft der TreeNode.

Du hast zwei Möglichkeiten, deine Treeview aufzubauen:
1. Vollständig, also alle Records werden sofort in die TreeView geladen. Das lohnt sich nur, wenn es nicht all zu Viele sind.
2. Du lädst erst alle Knoten der untersten Ebene und fügst einen 'Dummy-Child'-Knoten ein, damit das '+' links vom Knoten erscheint. Beim Klick auf das '+' (OnExpand) eines Knotens K klickst, prüfst Du, ob der Kind-Knoten eines dieser 'Dummy-Childs' ist. Wenn ja, löscht Du es, lädst alle Records mit der Eigenschaft (ParentID = K.Tag) und fügst diese Knoten als Kinder des Knotens K ein. Jeder Kindknoten bekommt wieder ein Dummy-Child. Damit lassen sich beliebig(!) große Bäume relativ schnell laden.

Wenn Du dagegen alle Knoten auf einmal laden willst, gibt es wieder diverse Möglichkeiten. Die einfachste ist die:

Delphi-Quellcode:
Procedure InsertNode (aMyData : TDataRecord);
Var
  i : Integer;

Begin
  If aMyData.ParentID = -1 Then // Objekt der obersten Ebene
    MyTreeView.AddObject (Nil,aMyData.Description, aMyData)
  Else
    For i:=0 To MyTreeView.Items.Count - 1 do
      If MyTreeView.Items[i].Tag = aMyData.ParentID Then
        MyTreeView.AddChildObject(MyTreeView.Items[i], aMyData.Description, aMyData);
End;
Kleine Anmerkung für Performancefetischisten:
-Der Zugriff auf die TTreeNodes per Items[i] ist *nicht* langsam, obwohl das so in der OH steht.
-Der gesamte Prozess ist nicht sonderlich schnell.

Es gibt diverse andere Komponenten, die das von Hause aus können, also einfach mit einem TDataSource verbinden, die Eigenschaften 'ParentField' und 'KeyField' setzen und den Rest erledigt die Komponente.

Hat die JVCL nicht so etwas im Gepäck?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat