FireMonkey-Funktion "Status speichern"

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu FireMonkey-Anwendungshandbuch


Die FireMonkey-Funktion Status speichern ermöglicht das Speichern von Daten, die den Status der Anwendung vor dem Schließen beschreiben. Mit den Daten des Speichern-Status kann der Zustand der Anwendung nach einem Neustart wiederhergestellt werden.

Funktionsweise von Geräten ohne die Funktion "Status speichern"

Wenn sich auf mobilen Geräten, insbesondere auf Android-Plattformen, eine Anwendung im Hintergrund befindet, könnte das Betriebssystem den Prozess abbrechen. Dies kann aufgrund bestimmter Bedingungen erfolgen, wie z. B. wenig Arbeitsspeicher oder einfach, weil zu viele Prozesse ausgeführt werden. In diesem Fall verbleiben die vom Benutzer eingegebenen Informationen nicht in der Anwendung.

Auf Android wird durch Aktivieren der Option Aktionen nicht speichern unter Einstellungen > Entwickleroptionen die Anwendung neu gestartet, wenn die Home-Taste gedrückt und dann zurück zur Anwendung gewechselt wird. Alle zuvor eingegeben Daten sind dann verloren.

Um dieses Problem zu beheben, stellt Android einen besonderen Speicher, "SaveState", zur Verfügung, in dem der Status der Anwendung gespeichert und wiederhergestellt werden kann, wenn die Anwendung neu gestartet wird. Die Speicherung dieses Status ist nur "temporär"; wenn Sie die Anwendung manuell oder über den Task-Manager schließen und dann erneut starten, ist der vorherige "temporäre" Status verloren.

Nach dem Neustart einer Anwendung wäre es praktisch, wenn die Anwendung in demselben Zustand verbliebe, in dem sie sich vor dem Versetzen in den Hintergrund befunden hat.

Funktion "Status speichern" in FireMonkey

Die FireMonkey-Funktion Status speichern ermöglicht das Speichern von Daten mit dem Status der Anwendung vor dem Schließen. Mit den Daten des Speichern-Status kann der Zustand der Anwendung nach einem Neustart wiederhergestellt werden.

Der Speichern-Status kann Informationen, wie aktive Registerkarte, in Steuerelementen enthaltener Text, Auswahl von Kontrollkästchen, Kalenderdatum, aktuell ausgewählter Eintrag usw., sowie weitere Daten enthalten.

Die FireMonkey-Funktion Status speichern implementiert einen Mechanismus zur Verarbeitung des temporären "SaveState"-Android-Mechanismus und des persistenten Speichern-Status, indem Daten auf der Festplatte gespeichert werden. Auf Nicht-Android-Plattformen emuliert diese Funktion einen temporären Speichern-Status, bei dem Dateien an temporären Speicherorten und der persistente Status an dem gewünschten Speicherort gespeichert werden.

Das Verhalten dieser Funktion auf Desktop-Plattformen entspricht dem Verhalten auf mobilen Plattformen, d. h., der Speichern-Status speichert den Anwendungsstatus. Es ist aber nicht gewährleistet, dass die Speicherung persistent ist; wenn Sie beispielsweise die temporäre Datei, in der diese Informationen gespeichert sind, auf Windows löschen, startet die Anwendung neu, ohne den Status wiederherzustellen, den sie vor dem Schließen hatte.

Für die Behandlung des Speicherns dieser Daten stellt TForm das Ereignis OnSaveState bereit: alle Formulardaten sollten während dieses Ereignisses gespeichert werden, damit sie beim Neustart der Anwendung wiederhergestellt werden können.

Von TCommonCustomForm abgeleitete FireMonkey-Formulare, wie TForm und TForm3D, verfügen über die Eigenschaft SaveState mit dem Typ TFormSaveState zur Verwaltung des Speichern-Status. Die Klasse TFormSaveState stellt Methoden und Eigenschaften zur Verwaltung des Speichern-Status des Formulars bereit, Die Klasse verwendet den Dienst IFMXSaveStateService, der die erforderliche Funktionalität für das Ermitteln und Setzen des Speichern-Status auf der Zielplattform definiert.

Speicher-Stream

In der Eigenschaft SaveState.Stream wird der Speicher-Stream als TMemoryStream gespeichert. Diese Eigenschaft kann jederzeit gelesen und/oder geschrieben werden, obwohl:

  • Das Schreiben von Daten in den Stream vorzugsweise während des Ereignisses OnSaveState erfolgen sollte.
  • Das Lesen von Daten aus dem Stream vorzugsweise während des Ereignisses OnCreate erfolgen sollte.

Sie können Hilfsklassen, wie TBinaryReader und TBinaryWriter, mit diesem Stream als Parameter verwenden, um das Speichern von Informationen, wie numerische oder String-Werte, zu unterstützen.

Sie können auch global auf diese Funktion zugreifen, ohne das TCommonCustomForm wiederherzustellen. Sie können von der Plattform den Dienst IFMXSaveStateService anfordern und mit dessen Methoden die Speichern-Status-Daten speichern und laden.

Speicherort und -name

Die Eigenschaft SaveState.StoragePath ermöglicht die Angabe eines "Speicherpfades" für den Speichern-Status:

  • Wenn StoragePath leer ist (Vorgabe), ist der Speichern-Status temporär und verwendet entweder vom Betriebssystem bereitgestellte Funktionen (wie "SaveState" auf Android) oder einen temporären Speicherort.

Die Daten verbleiben dort, wenn die Aktivität vom Betriebssystem neu gestartet wird, gehen aber auf mobilen Plattformen verloren, wenn die Anwendung manuell vom Benutzer beendet wird. Auf anderen Plattformen werden die Daten an einem temporären Speicherort gespeichert und bleiben verfügbar, bis diese temporären Dateien gelöscht werden (auf Windows beispielsweise bei einer Festplattenbereinigung).

  • Wenn StoragePath nicht leer ist (sondern beispielsweise auf TPath.GetHomePath gesetzt ist), dann ist der Speichern-Status persistent und wird auf der Festplatte an diesem Speicherort gespeichert.

Die Speichern-Status-Daten verbleiben während der Ausführung unverändert, und Sie können so lange Informationen daraus wiederherstellen, bis Sie diese Daten explizit mit SaveState.Stream.Clear löschen. Wenn Sie die Daten mit SaveState.Stream.Clear löschen oder IFMXSaveStateService.SetBlock mit auf nil gesetzten Blockdaten aufrufen, werden die Daten aus dem temporären Speicher entfernt bzw. bei der persistenten Speicherung wird die Datei gelöscht.

Es wird empfohlen, für temporäre und persistente Status die Eigenschaft SaveState.Name auf einen gewünschten Namen oder Dateinamen, wenn sie sich auf der Festplatte befinden, zu setzen. Wenn die Eigenschaft Name leer gelassen wird, erstellt das Formular einen Namen und hängt eine Kombination aus Anwendungsnamen, Klassennamen und Formularnamen an.

Hinzufügen des Speichern-Status zu Anwendungen

So verwenden Sie die Funktion Status speichern:

  1. Erstellen Sie eine neue geräteübergreifende Anwendung.
  2. Ziehen Sie eine TEdit-Komponente auf das Formular.
  3. Wählen Sie das Formular aus, doppelklicken Sie auf das Ereignis OnCreate, und fügen Sie den folgenden Code hinzu:
    Object Pascal:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      R: TBinaryReader;
    begin
      if SaveState.Stream.Size > 0 then
      begin
        // Recover previously typed text in Edit1 control.
        R := TBinaryReader.Create(SaveState.Stream);
        try
          Edit1.Text := R.ReadString;
        finally
          R.Free;
        end;
      end;
    end;
    
    C++:
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    	TBinaryReader *R;
    	if (SaveState->Stream->Size >0) {
    		// Recover previously typed text in Edit1 control.	
    		R = new TBinaryReader(SaveState->Stream, TEncoding::UTF8, false);
    		try {
    			Edit1->Text = R->ReadString();
    		} __finally {
    			R->Free();
    		}
    	}
    }
    
  4. Wählen Sie im Formular-Designer das Formular aus, doppelklicken Sie auf das Ereignis OnSaveState, und fügen Sie den folgenden Code hinzu:
    Object Pascal:
    procedure TForm1.FormSaveState(Sender: TObject);
    var
      W: TBinaryWriter;
    begin
      SaveState.Stream.Clear;
      // Current state is only saved when something was edited.
      // If nothing has changed, the state will be removed this way.
      if Edit1.Text.Length > 0 then
      begin
        // Save typed text in Edit1 control.
        W := TBinaryWriter.Create(SaveState.Stream);
        try
          W.Write(Edit1.Text);
        finally
          W.Free;
        end;
      end;
    end;
    
    C++:
    void __fastcall TForm1::FormSaveState(TObject *Sender)
    {
    	TBinaryWriter *W;
    	SaveState->Stream->Clear();
    	// Current state is only saved when something was edited.
    	// If nothing has changed, the state will be removed this way.
    	if (Edit1->Text.Length() >0) {
    		// Save typed text in Edit1 control.
    		W = new TBinaryWriter(SaveState->Stream);
    		try {
    			W->Write(Edit1->Text);
    		} __finally {
    			W->Free();
    		}
    	}
    }
    

    Im obigen Codefragment sind die Speichern-Daten temporär, und Edit1 behält weiterhin seinen Text, auch wenn die Anwendung neu gestartet wird. Da dieser Speichern-Status temporär ist, werden die Speichern-Daten gelöscht, wenn die Anwendung auf mobilen Geräten (manuell) geschlossen wird.

  5. Damit diese Speichern-Daten persistent werden, fügen Sie die folgende Codezeile am Anfang des Ereignisses FormCreate ein:
    Object Pascal:
    SaveState.StoragePath := TPath.GetHomePath;
    
    Hinweis: Stellen Sie sicher, dass System.IOUtils in der uses-Klausel enthalten ist.
    C++:
    SaveState->StoragePath = System::Ioutils::TPath::GetHomePath();
    
    Hinweis: Stellen Sie sicher, dass #include <System.IOUtils.hpp> in der Header-Datei enthalten ist.

Wenn Sie die Anwendung auf einer Windows Vista-Plattform oder später ausführen, wird eine temporäre Datei mit dem Namen ~Anwendungsname_FM_Klassenname_Formularname.TMP (wie z. B. ~SaveStateCodeSnippet_FM_TForm1_Form1.TMP) in folgendem Stammpfad gespeichert: C:\Benutzer\<Benutzername>\AppData\Roaming.

Siehe auch