AGB  ·  Datenschutz  ·  Impressum  







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

Problem beim Einfügen in Treeview

Ein Thema von fkerber · begonnen am 12. Mai 2006 · letzter Beitrag vom 12. Mai 2006
Antwort Antwort
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 07:13
Hallo!

Als Grundlage nutze ich eine Datenbank mit folgendem Aufbau:

Zitat:
ID | Name | Parent
---------------------------
1 | Objekt 1 | 0
2 | Objekt 2 | 0
3 | Objekt 3 | 1
4 | Objekt 4 | 2
5 | Objekt 5 | 4
Meine Idee war jetzt, ein Treeview so aufzubauen:

Delphi-Quellcode:
Objekt 1
   Objekt 3
Objekt 2
   Objekt 4
      Objekt 5

Das würde soweit auch alles ganz toll klappen, wenn sich die Einträge (bzw. die Reihenfolge) der Items nicht ändern würde.
Als Beispiel:
  • ich füge Objekt 1 ein (ist somit Item[0])
  • ich füge Objekt 2 ein (ist dann Item[1])
  • dann füge ich Objekt 3 ein und dann hab ich den Salat:
    Jetzt ist nämlich Objekt 3 Item[1] und Objekt 2 ist jetzt Item[2]

Und somit passt mein System, den ParentWert aus der DB als ParentNode zu holen.

Entweder ist es noch zu früh oder es hat andere Gründe , aber auf jeden Fall bin ich ratlos, wie ich diesen Treeview so aufgebaut bekomme, wie ich ihn gerne hätte.


Danke für eure Hilfe.
Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 07:16
die ID sollte sich doch aber nicht ändern wenn mittendrin ein DS eingefügt wird. Und wenn du beim als Parent die ID des Parents angibst dürfte es doch keine Probleme geben.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
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
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#4

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 07:36
Hi!

@SirThornberry:
Die ID (in der Datenbank) ändert sich auch nicht - wohl aber der Index im Array Items, der mir die Stelle angibt, wo da Item gerade rumsteht...

@alzaimar:
Danke für deine Ausführungen, hätte es auch gerne so gemacht, aber die TreeNodes haben keine Eigenschaft Tag und soweit ich das sehen kann auch nichts anderes verwertbares (außer dem text, den ich ja aber brauche...)


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#5

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 09:40
Hi!

So, ich habe mich dazu entschlossen, dann eben kurzerhand die Tag-Property nachzurüsten und dann werde ich es so umsetzen.

Danke für eure Tipps.


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 09:54
anstelle des Nachrüstens hättest du auch die Data-Eigenschaft nutzen können. Dort einfach ein Object rein hängen was dein "Tag"-Property hat oder wie du es dann nennen willst und zusätzlich Speicher für deine eigentlichen Daten
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 10:07
TreeNodes haben kein Tag? Ich werd alt...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#8

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 10:16
HI!

Danke für den Tipp, SirT - schau ich mir mal noch an.

@alzaimar:
War auch sehr erstaunt, war auch mein erster Gedanke gewesen...


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Problem beim Einfügen in Treeview

  Alt 12. Mai 2006, 12:38
Hallo alzaimar,

Zitat von alzaimar:
TreeNodes haben kein Tag? :oops: Ich werd alt...
anders herum wird ein Schuh draus - das vom TreeNode gekapselte relativ moderne ListView-Item hat von Hause aus bereits ein Tag (Data). Für die alten Controls haben die VCL-Entwickler das Tag im Wrapper vorgehalten.

Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:16 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