AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zustand eine TreeViews speichern und wieder laden
Thema durchsuchen
Ansicht
Themen-Optionen

Zustand eine TreeViews speichern und wieder laden

Ein Thema von RWarnecke · begonnen am 27. Okt 2008 · letzter Beitrag vom 1. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 09:21
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 09:29
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 09:41
Zitat von Bernhard Geyer:
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.
Es ist die ganz normale Standard TreeView-Komponente. Im XML eins zu eins abbilden ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#4

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 11:20
Moin, Moin Rolf

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:
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;
Optional könnte man den Stream jetzt noch komprimieren/dekomprimieren.


//edit: Ist das nicht eher ein VCL-Thema?
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 19:19
Hallo Ralph,

danke für Dein Beispiel. Werde es mal ausprobieren und dann hier berichten ob es funktioniert hat.

Zitat von taaktaak:
//edit: Ist das nicht eher ein VCL-Thema?
Ich bin mir da nicht ganz so sicher, da ich hier nur die Vorgehensweise, Speichermöglichkeiten u.s.w. diskutieren wollte/möchte.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#6

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 20:15
Zitat von RWarnecke:
Zitat von Bernhard Geyer:
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.
Es ist die ganz normale Standard TreeView-Komponente. Im XML eins zu eins abbilden ?
Was müssen denn außer den Nodetexten und ob die Nodes einge- bzw- ausgeklappt sind noch für Infos gespeichert werden?

Gruß
--
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 27. Okt 2008, 20:19
Zitat von calculon:
Zitat von RWarnecke:
Zitat von Bernhard Geyer:
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.
Es ist die ganz normale Standard TreeView-Komponente. Im XML eins zu eins abbilden ?
Was müssen denn außer den Nodetexten und ob die Nodes einge- bzw- ausgeklappt sind noch für Infos gespeichert werden?

Gruß
--
Ich möchte eigentlich lediglich nur den Zustand der einzelnen Nodes speichern, ob einge- bzw. ausgeklappt ist. Der TreeView wird zuerst über eine Datenbank dynamisch gefüllt.

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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.993 Beiträge
 
Delphi 7 Professional
 
#8

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 28. Okt 2008, 08:22
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:
// 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
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.

// edit
Zitat:
Der TreeView wird zuerst über eine Datenbank dynamisch gefüllt.
Eigentlich ist das dann doch alles unnötig kompliziert, oder? Einfacher ist es wohl, den NodeStatus ebenfalls in der Datenbank zu führen und unmittelbar nach dem Füllen der TreeViews aus der Datenbank zu setzen?!
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#9

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 28. Okt 2008, 10:02
Zitat von taaktaak:
[..]
Zitat:
Der TreeView wird zuerst über eine Datenbank dynamisch gefüllt.
Eigentlich ist das dann doch alles unnötig kompliziert, oder? Einfacher ist es wohl, den NodeStatus ebenfalls in der Datenbank zu führen und unmittelbar nach dem Füllen der TreeViews aus der Datenbank zu setzen?!
Einfacher und wahrscheinlich auch verlässlicher, aber ich kann mir vorstellen, dass er seine Datenbank von solchen Informationen freihalten will.

Gruß
--
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Zustand eine TreeViews speichern und wieder laden

  Alt 28. Okt 2008, 12:25
Zitat von calculon:
Zitat von taaktaak:
[..]
Zitat:
Der TreeView wird zuerst über eine Datenbank dynamisch gefüllt.
Eigentlich ist das dann doch alles unnötig kompliziert, oder? Einfacher ist es wohl, den NodeStatus ebenfalls in der Datenbank zu führen und unmittelbar nach dem Füllen der TreeViews aus der Datenbank zu setzen?!
Einfacher und wahrscheinlich auch verlässlicher, aber ich kann mir vorstellen, dass er seine Datenbank von solchen Informationen freihalten will.

Gruß
--
Ja, das möchte ich. In der Datenbank sollen nur die Daten stehen. Da ich auch plane in dem Programm den Ort der Datenbank konfiguriebar zu machen (z.B. für einen Datenbankserver). Oder ist es dann vielleicht gerade besser die Zustände (expand oder collapse) der Nodes in der Datenbank zu speichern ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:11 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