![]() |
Zustand eine TreeViews speichern und wieder laden
Hallo zusammen,
ich habe in meinem Programm Code-Orakel ja einen TreeView. Ich möchte nun die Möglichkeit bieten, dass der Zustand des TreeViews gespeichert wird und beim nächsten mal Starten die gleichen Nodes wieder erweitert sind, wie vor dem schliessen. Wie würdet Ihr da vorgehen ? Registry fällt flach, da das Programm unabhängig vom PC sein soll. Edit: Das ich den Tree druchgehen muss ist mir schon klar. |
Re: Zustand eine TreeViews speichern und wieder laden
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.
|
Re: Zustand eine TreeViews speichern und wieder laden
Zitat:
|
Re: Zustand eine TreeViews speichern und wieder laden
Moin, Moin Rolf :hi:
War ja mein Wunsch und bisher hatte ich auch noch keine Lösung dafür. Habe daher mal überlegt, wie man das Lösen könnte. Hier mein Vorschlag:
Delphi-Quellcode:
Optional könnte man den Stream jetzt noch komprimieren/dekomprimieren.
procedure TfoTest03.LoadTree(TV:TTreeView;FName:String);
var MS : TMemoryStream; i,Count : Integer; NodeState : Boolean; begin MS:=TMemoryStream.Create; try MS.LoadFromFile(FName); MS.Read(Count,SizeOf(Count)); MS.Seek(Count,soFromCurrent); // jump to start of node data TV.Items.BeginUpdate; TV.LoadFromStream(MS); // load nodes MS.Seek(SizeOf(Count),soFromBeginning); // jump back to start of expand data for i:=0 to Count-1 do begin MS.Read(NodeState,SizeOf(NodeState)); TV.Items[i].Expanded:=NodeState // load node expand state end; TV.Items.EndUpdate finally MS.Free end end; procedure TfoTest03.SaveTree(TV:TTreeView;FName:String); var MS : TMemoryStream; i,Count : Integer; NodeState : Boolean; begin MS:=TMemoryStream.Create; try Count:=TV.Items.Count; MS.Write(Count,SizeOf(Count)); for i:=0 to Count-1 do begin // save node expand state NodeState:=TV.Items[i].Expanded; MS.Write(NodeState,SizeOf(NodeState)); end; TV.SaveToStream(MS); // save nodes MS.SaveToFile(FName) finally MS.Free end end; //edit: Ist das nicht eher ein VCL-Thema? |
Re: Zustand eine TreeViews speichern und wieder laden
Hallo Ralph,
danke für Dein Beispiel. Werde es mal ausprobieren und dann hier berichten ob es funktioniert hat. Zitat:
|
Re: Zustand eine TreeViews speichern und wieder laden
Zitat:
Gruß -- |
Re: Zustand eine TreeViews speichern und wieder laden
Zitat:
Edit: Nach der Datenbankabfrage sollen dann die Nodes auf Expand = True oder False gesetzt werden. So wie beim letzten schliessen der Anwendung es gespeichert wurde. |
Re: Zustand eine TreeViews speichern und wieder laden
Moin, Moin Zusammen!
Die Frage von Calculon ist berechtigt! Mit der von mir vorgestellten Lösung werden die Icons nicht gesichert. Abhilfe ist aber sehr leicht möglich, wenn Lesen/Schreiben des Streams geändert wird:
Delphi-Quellcode:
Alternativ könnte man natürlich auch die Zustände von ImageIndex, StateIndex und SelectedIndex mit dem gleichen Verfahren behandeln mit dem im Beispiel der NodeStatus gesichert/wiederhergestellt wird.
// TV.LoadFromStream(MS) // load nodes, change to:
MS.ReadComponent(TV) // load nodes AND icons // bzw. // TV.SaveToStream(MS); // save nodes, change to: MS.WriteComponent(TV); // save nodes AND icons // edit Zitat:
|
Re: Zustand eine TreeViews speichern und wieder laden
Zitat:
Gruß -- |
Re: Zustand eine TreeViews speichern und wieder laden
Zitat:
|
Re: Zustand eine TreeViews speichern und wieder laden
Moin moin,
Zitat:
|
Re: Zustand eine TreeViews speichern und wieder laden
Na, da sind wir wieder beim "APPDATA-Thema" - wird das korrekt erledigt, dann ist es ja automatisch user-bezogen.
Zum Thema "in der Datenbank oder nicht?" Werden die NodeStatus-Daten außerhalb der Datenbank gespeichert, ist das natürlich nicht so ganz problemlos: Was ist, wenn die extern gespeicherte Struktur der NodeStatus-Daten von der aus der Datenbank eingelesenen Struktur abweicht? Dann die externen NodeStatus-Daten löschen und den Tree wieder "normal" anzeigen?! |
Re: Zustand eine TreeViews speichern und wieder laden
Moin moin,
Zitat:
ändern oder was auch immer die Daten(=TV-Zustände) der einzelnen User synchronisieren. Auch da stellt sich die Frage, was ist wenn... |
Re: Zustand eine TreeViews speichern und wieder laden
Ja, das ist richtig!
Dann ist es wohl doch vorteilhafter, separat und user-bezogen zu speichern und im Fall abweichender Strukturen wieder die Standardanzeige zu verwenden. |
Re: Zustand eine TreeViews speichern und wieder laden
Der Ansicht bin ich auch... Stand halt vor kurzem vor der gleichen Frage - ich merke mir jetzt nur
den zuletzt selektierten Knoten und wenn er existiert mach ich den Baum bis dahin auf. Aber evtl. kommen ja doch noch Vorschläge... [EDIT] denglish entfernt [/EDIT] |
Re: Zustand eine TreeViews speichern und wieder laden
Hallo zusammen,
ich bin endlich dazu gekommen, das Beispiel von Ralph auszuprobieren. Mit der kleinen Änderung bezüglich der Icons funktioniert das Beispiel einwandfrei. Das ist eigentlich ein guter Eintrag für die Code-Library finde ich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz