Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zustand eine TreeViews speichern und wieder laden (https://www.delphipraxis.net/123072-zustand-eine-treeviews-speichern-und-wieder-laden.html)

RWarnecke 27. Okt 2008 08:21


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.

Bernhard Geyer 27. Okt 2008 08:29

Re: Zustand eine TreeViews speichern und wieder laden
 
Falls die eingesetzte Tree-Komponente nichts bietet würde ich das mit XML machen.

RWarnecke 27. Okt 2008 08:41

Re: Zustand eine TreeViews speichern und wieder laden
 
Zitat:

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 ?

taaktaak 27. Okt 2008 10:20

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:
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?

RWarnecke 27. Okt 2008 18:19

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:

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.

calculon 27. Okt 2008 19:15

Re: Zustand eine TreeViews speichern und wieder laden
 
Zitat:

Zitat von RWarnecke
Zitat:

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ß
--

RWarnecke 27. Okt 2008 19:19

Re: Zustand eine TreeViews speichern und wieder laden
 
Zitat:

Zitat von calculon
Zitat:

Zitat von RWarnecke
Zitat:

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.

taaktaak 28. Okt 2008 07:22

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:
// 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?!

calculon 28. Okt 2008 09:02

Re: Zustand eine TreeViews speichern und wieder laden
 
Zitat:

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ß
--

RWarnecke 28. Okt 2008 11:25

Re: Zustand eine TreeViews speichern und wieder laden
 
Zitat:

Zitat von calculon
Zitat:

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 ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 Uhr.
Seite 1 von 2  1 2      

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