| Autor |
Beitrag |
a.C.k
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mi 13.08.03 10:31
Sorry für die Topic, kanns leider nicht besser beschreiben  .
Ich nutze eine TTreeview. In diese lese ich daten aus einer Datenbank ein.
Das Modell sieht ungefähr so aus:
Beim öffnen eines knotens werden die Daten aus der Datenbank ausgelesen.
Nun habe ich vollgendes Problem:
Wenn sich nun Daten verändern muss der Baum neu geladen werden. Wie kann ich mir merken, welche Knoten geöffnet waren und welche geschlossen.
Wenn ich den Baum neu lade sind standartmäsig alle Knoten geschlossen... das kann nicht sinn der Sache sein.
Vielen Dank im Vorraus!
Gruß a.C.k
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 12:00
Da gibt´s ´ne Eigenschaft ("Expanded"? mangels Delphi ohne Gewähr!), die du bei einem TTreeNode abfragen kannst. Zum Ausklappen gibt´s dann (wieder ohne Gewähr  ) die Funktion "Expand", mit der Möglichkeit, rekursiv alle Unterknoten aufzuklappen.
Schau mal bitte in die Hilfe zu TTreeNode. Da müsste das drin stehen.
Gruß.
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Mi 13.08.03 13:36
Vielen Dank soweit!
Nur stellt sich mir die Frage, wie ermittle ich am geschicktesten, welcher Knoten offen ist  .
Vom Ablauf her habe ich es mir so vorgestelt.
Speichern von geöffneten Knoten -> Neu Laden aus Datenbank -> Knoten die offenwatren wieder öffnen.
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 15:47
Na, wo ist denn das Problem?
1. offene Knoten speichern: am besten via for-Schleife durch alle TreeView-Items durch und die o.g. Eigenschaft "Expanded" abfragen und speichern.
2. Beim Laden dann umgekehrt: die gespeicherten Werte auslesen und den jeweiligen Knoten mit der Funktion "Expand" öffnen. Der Bool-Wert (rekursiv) muss dann aber false sein.
Und? War doch nicht schwer? 
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Mi 13.08.03 16:47
| MathiasSimmack hat folgendes geschrieben: | | Na, wo ist denn das Problem? |
Die Tabellenstruktur kann sich geändert haben.
Man müsste also das Flag Expanded jeweils DataSource-bezogen abspeichern, da eine Referenz auf den TreeNode oder die Information "Item 3 ist Expanded" durch das Update seine Gültigkeit verliehrt.
Nach dem Update muss man dann alle Elemente durchlaufen und kann bei gleicher DataSource wieder Expanded auf true setzen (unter der Vorraussetzung das die Quelle nicht mehrfach auftritt).
Speichern liesse sich das in einem dynamischen Array oder einer T(String)List.
MfG,
Tryer
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 13.08.03 16:56
| Tryer hat folgendes geschrieben: | Die Tabellenstruktur kann sich geändert haben.
Man müsste also das Flag Expanded jeweils DataSource-bezogen abspeichern, da eine Referenz auf den TreeNode oder die Information "Item 3 ist Expanded" durch das Update seine Gültigkeit verliehrt. |
Ich bin mal davon ausgegangen, dass a.C.k so clever ist und den Zustand der Knoten in Abhängigkeit von den angezeigten Daten speichert. Das muss IMHO auch nicht extra erwähnt werden.
Ich meine, ich mach´s auch so, wenn ich z.B. XML-Daten anzeigen lasse, die (neben den eigentlichen Infos) auch den Zustand des jeweiligen Knotens definieren. Und weil dieser Zustand in 99% der Fälle gleich mit dem anzuzeigenden Wert gespeichert wird, ist´s auch egal, ob es mehrere identische Knoten gibt.
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Mi 13.08.03 17:10
| MathiasSimmack hat folgendes geschrieben: | Ich bin mal davon ausgegangen, dass a.C.k so clever ist und den Zustand der Knoten in Abhängigkeit von den angezeigten Daten speichert. Das muss IMHO auch nicht extra erwähnt werden.
 |
Wenn es ihm so klar gewesen wäre hätt er vermutlich nicht gefragt.. ich hab nur versucht das nochmal zu verdeutlichen.
Sorry falls ich deine Augen zuviel zugemutet habe 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 09:11
Es geht ja nicht um meine Augen.  Ich glaube, so dumm wird a.C.k wohl nicht sein. Schließlich war seine Frage ja:
| Zitat: | | Wie kann ich mir merken, welche Knoten geöffnet waren und welche geschlossen. |
womit für mich die Voraussetzung gegeben ist, dass er die selben Knoten (identifizierbar anhand des Namens, oder ... was weiß ich ...) später wieder geöffnet anzeigen lassen will.
Du solltest den Leuten ruhig was zutrauen. 
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Do 14.08.03 09:51
[OT]
| MathiasSimmack hat folgendes geschrieben: | Du solltest den Leuten ruhig was zutrauen.  |
Deswegen hatte ich unter anderem auch erwähnt in welchen Strukturen es sich speichern liesse, denn darauf zielte seine Frage wohl ab.
Das er alle Elemente durchlaufen muss war ihm vermutlich auch schon klar  .. aber lassen wir das.
Ich denke mal wir sollten uns nicht in die Haare kriegen bei der Diskussion welcher Tip eventuell zu ausführlich ist, solange keine Falschaussagen zu berichtigen sind sollte das man bei der Fragestellung bleiben.
[/OT]
MfG,
Tryer
PS: falls es dazu noch was zu diskutieren gibt bitte per PM.
|
|
a.C.k 
      
Beiträge: 93
WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
|
Verfasst: Do 14.08.03 10:59
Sorry leute wenn meine Fragestellung nun zu so nem Wirbel geführt hat!
Der Tip mit der eigenschafft Expandet hat mir sehr weitergeholfen (muss diese eigenschafft in der Hife übersehen haben  ).
Auf die Idee mit dem Speichern in einem Dyn. Array war ich aucvh schon gekommen, allerdings hoffte ich eine Elegantere Lösunung seitens der Komponente finden zu können (bzw. gezeigt zu bekommen).
Die Treeveiw merkt sich ja irgendwie, welche Knoten bereits geöffnet wurden (gehe hauptsächlich von unterknoten aus). Denn wenn ich einen Knoten schließe und dann wieder öffne befinden sich die unterknoten immer noch im selben zustand wie zuvor.
So kam ich auf die Fixe Idee, diese Informationen von der Komponente bekommen zu können, bzw sie wieder an die Komponente weitergeben zu können.
Dies wäre leichter und vor allem wahrscheinlich schneller gewesen... zumindest denke ich das.
_________________ Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 12:15
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 14.08.03 13:14
so wie ich das sehe, ist das problem ja, dass sich die baumstruktur
geändert haben kann. deshalb kann man as nicht über TreeView.Items[x]
lösen, finde ich.
falls du die informationen in der datenbank so abgespeichert hast,
dass jeder knoten ein datensatz ist, dann kannst du ja in die db ein
neues feld einfügen (boolean) und node.expanded darin abspeichern.
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 14.08.03 13:49
| ShadowThief hat folgendes geschrieben: | | so wie ich das sehe, ist das problem ja, dass sich die baumstruktur geändert haben kann. deshalb kann man as nicht über TreeView.Items[x] lösen, finde ich. |
 Du siehst Probleme, wo gar keine sind. Das beweist dein letzter Satz:
| Zitat: | falls du die informationen in der datenbank so abgespeichert hast,
dass jeder knoten ein datensatz ist, dann kannst du ja in die db ein
neues feld einfügen (boolean) und node.expanded darin abspeichern. |
Nun musst du den Datensatz aber erst mal identifizieren, um den jeweils gültigen Status des Knotens auch an der richtigen Stelle zu speichern. Und wenn du diese Status-Speicherung auf einen Rutsch machen willst (etwa beim Beenden des Programms), dann wird dir wohl nichts übrig bleiben, als mit einer for-Schleife alle Items zu durchlaufen. Und damit greifst du automatisch auf "TreeView.Items[x]..." zurück.
Und da du den Datensatz anhand irgendeines Elementes des TreeView-Knotens identifizierst, spielen auch mögliche Veränderungen in der Daten- oder Baumstruktur eine untergeordnete Rolle.
Punkt.
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Do 14.08.03 20:14
| MathiasSimmack hat folgendes geschrieben: |
Nun musst du den Datensatz aber erst mal identifizieren, um den jeweils gültigen Status des Knotens auch an der richtigen Stelle zu speichern. Und wenn du diese Status-Speicherung auf einen Rutsch machen willst (etwa beim Beenden des Programms), dann wird dir wohl nichts übrig bleiben, als mit einer for-Schleife alle Items zu durchlaufen. Und damit greifst du automatisch auf "TreeView.Items[x]..." zurück.
|
das stimmt natürlich.
ich dachte dabei eher an das auslesen aus der datenbank.
| MathiasSimmack hat folgendes geschrieben: |
Punkt.
|
ok
shadow.
|
|