Fonctionnalité Enregistrer l'état de FireMonkey

De RAD Studio
Aller à : navigation, rechercher

Remonter à Guide des applications FireMonkey


La fonctionnalité Enregistrer l'état de FireMonkey vous permet d'enregistrer les données décrivant l'état de l'application avant sa fermeture. Les données d'enregistrement de l'état peuvent être utilisées pour récupérer l'état après le redémarrage de l'application.

Comment les périphériques fonctionnent sans la fonctionnalité Enregistrer l'état

Sur les périphériques mobiles, plus particulièrement avec la plate-forme Android, lorsqu'une application est en arrière-plan, le système d'exploitation peut décider de détruire le processus. Cela peut être du à certaines conditions, telles qu'une mémoire basse ou simplement trop de processus en cours d'exécution. Dans ce cas, les informations entrées par l'utilisateur ne restent pas dans l'application.

Sur Android, l'activation de l'option Ne pas garder les activités sous Paramètres > Options de développement provoque le redémarrage de l'application lorsque vous appuyez sur le bouton principal puis revenez à l'application, ce qui entraîne la perte des données préalablement entrées.

Pour résoudre ce problème, Android propose un stockage particulier appelé "SaveState", où l'état de l'application est stocké et restitué lors du redémarrage de l'application. L'enregistrement de cet état est seulement "temporaire". Si vous fermez l'application manuellement ou depuis le Gestionnaire de tâches, puis la redémarrez, l'état "temporaire" précédent sera perdu.

Dès qu'une application redémarre, il peut être pratique qu'elle reste dans l'état où elle était avant d'être placée en arrière-plan.

Fonctionnalité Enregistrer l'état de FireMonkey

La fonctionnalité Enregistrer l'état de FireMonkey vous permet d'enregistrer les données avec l'état de l'application avant sa fermeture. Les données d'enregistrement de l'état peuvent être utilisées pour récupérer l'état après le redémarrage de l'application.

L'enregistrement de l'état peut inclure des informations telles que l'onglet actif, le texte contenu dans les contrôles d'édition, la sélection de case à cocher, la date du calendrier, l'élément actuellement sélectionné, et ainsi de suite, avec les données de l'utilisateur.

La fonctionnalité Enregistrer l'état de FireMonkey implémente un mécanisme permettant de gérer à la fois le mécanisme "SaveState" temporaire et l'enregistrement de l'état persistant par stockage des données sur disque. Sur les plates-formes non-Android, cette fonctionnalité émule un enregistrement de l'état temporaire en enregistrant les fichiers dans des emplacements temporaires, et stocke l'état persistant dans un emplacement désiré.

Le comportement de cette fonctionnalité sur les plates-formes de bureau est similaire à celui sur la plate-forme mobile, c'est-à-dire que la fonctionnalité Enregistrer l'état stocke l'état de l'application. Il n'est pas garanti que le stockage soit persistant. Par exemple, si vous supprimez sur Windows le fichier temporaire où ces informations sont stockées, l'application redémarre avec un état actualisé, sans retour à son état d'avant fermeture.

Pour gérer l'enregistrement de ces données, TForm a l'événement OnSaveState : toutes les données de la fiche sont enregistrées pendant cet événement, elles peuvent ainsi être récupérées au redémarrage de l'application.

Les fiches FireMonkey dérivées de TCommonCustomForm, telles que TForm et TForm3D, ont la propriété SaveState de type TFormSaveState, ayant pour but la gestion de l'enregistrement de l'état. La classe TFormSaveState propose des méthodes et des propriétés pour la gestion de l'enregistrement de l'état de la fiche, et elle utilise le service IFMXSaveStateService ; qui définit la fonctionnalité requise pour la récupération et la définition de l'enregistrement de l'état sur la plate-forme cible.

Flux mémoire

La propriété SaveState.Stream est l'endroit où le flux mémoire est stocké en tant que TMemoryStream. Il est possible de lire et/ou d'écrire dans cette propriété à tout moment, bien que :

  • L'écriture des données dans la propriété Stream doit de préférence se produire pendant l'événement OnSaveState.
  • La lecture des données de la propriété Stream doit de préférence se produire pendant l'événement OnCreate.

Vous pouvez utiliser les classes d'assistance, telles que TBinaryReader et TBinaryWriter, avec ce flux en paramètre pour vous aider à enregistrer des informations telles que des valeurs numériques et chaînes.

Vous pouvez également accéder globalement à cette fonctionnalité, sans restaurer le TCommonCustomForm. Vous pouvez demander le service IFMXSaveStateService de la plate-forme et utiliser ses méthodes pour enregistrer et charger les données d'enregistrement de l'état.

Nom et emplacement du stockage

La propriété SaveState.StoragePath permet la spécification d'un "chemin de stockage" pour l'enregistrement de l'état :

  • Si la propriété StoragePath est vide (par défaut), l'enregistrement de l'état est temporaire, et il utilisera les capacités du système d'exploitation (telles que "SaveState" sur Android) ou un emplacement temporaire.

Les données restent là si l'activité est redémarrée par le système d'exploitation, mais elles sont perdues si l'application est détruite manuellement par l'utilisateur dans le cas des plates-formes mobiles. Sur les autres plates-formes, les données sont enregistrées dans un emplacement temporaire et elles restent accessibles tant que ces fichiers temporaires ne sont pas supprimés (sur Windows, par exemple, lors du nettoyage du disque).

  • Si la propriété StoragePath n'est pas vide (par exemple, si elle est définie sur TPath.GetHomePath), les données de l'enregistrement de l'état sont alors persistantes et seront enregistrées sur le disque à cet emplacement.

Les données de l'enregistrement de l'état restent inchangées pendant l'exécution, et vous pouvez toujours récupérer des informations tant que vous n'avez pas effacé explicitement ces données en utilisant SaveState.Stream.Clear. Si vous effacez les données en utilisant SaveState.Stream.Clear ou en appelant IFMXSaveStateService.SetBlock avec les données de bloc définies sur nil, les données sont retirées du stockage temporaire ou le fichier est supprimé dans le cas d'un stockage persistant.

Nous vous recommandons de définir la propriété SaveState.Name sur un nom désiré, ou un nom de fichier si sur disque, pour les deux états temporaire et persistant. Si la propriété Name est laissée vide, la fiche crée un nom, en ajoutant une combinaison du nom de l'application, du nom de la classe et du nom de la fiche.

Ajout de l'enregistrement de l'état à votre application

Pour illustrer l'usage de la fonctionnalité Enregistrer l'état :

  1. Créez une nouvelle application multi-périphérique.
  2. Déposez un TEdit sur la fiche.
  3. Sélectionnez la fiche, double-cliquez sur l'événement OnCreate, et ajoutez le code suivant :
    Delphi :
    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. Revenez au Concepteur de fiches, sélectionnez la fiche, double-cliquez sur l'événement OnSaveState, et ajoutez le code suivant :
    Delphi :
    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();
    		}
    	}
    }
    

    Dans l'extrait de code ci-dessus, les données d'enregistrement sont temporaires, et Edit1 a toujours son texte même si l'application a redémarré. Puisque cet enregistrement de l'état est temporaire, les données d'état seront supprimées si l'application est fermée manuellement dans les périphériques mobiles.

  5. Afin de rendre ces données persistantes, ajoutez la ligne suivante au début de l'événement FormCreate :
    Delphi :
    SaveState.StoragePath := TPath.GetHomePath;
    
    Remarque : Assurez-vous que System.IOUtils est inclus dans la clause uses.
    C++ :
    SaveState->StoragePath = System::Ioutils::TPath::GetHomePath();
    
    Remarque : Assurez-vous que #include <System.IOUtils.hpp> est inclus dans le fichier d'en-tête.

Si vous exécutez l'application sur la plate-forme Windows Vista ou sur une version plus récente, un fichier temporaire ayant pour nom ~ApplicationName_FM_ClassName_FormName.TMP, comme par exemple ~SaveStateCodeSnippet_FM_TForm1_Form1.TMP, est enregistré dans le chemin principal suivant : C:\Users\<username>\AppData\Roaming.

Voir aussi