El fin de los archivos ini - Utilizando SaveState con Firemonkey

El título del post no es una afirmación tajante, sino más bien una apreciación personal viendo la  funcionalidad que he encontrado en Delphi, que hasta ahora desconocía y que me ha parecido muy práctica y fácil de utilizar.

Todo gira respecto a la utilidad SaveState

Cuando estamos trabajando con Android si nuestra app está en segundo plano, Android puede decidir que hay cerrarla bajo ciertas condiciones (Low Memory, escasez de recursos del S.O., etc...), cuando esto sucede necesitaríamos guardar ciertos parámetros que permitan restaurar la app en la misma situación en la que estaba antes de cerrarse, es decir es necesario salvar el estado del programa.

Para ello lo que se hace es crear un archivo temporal que se borra cuando la app se restaura, pero si ese archivo lo guardamos en "tpath.GetHomePath" el archivo es permanente hasta que nosotros decidamos suprimirlo.

Este archivo puede contener los siguientes tipo de datos (procede de la clase TBinaryReader, que permite leer tipos de datos desde un stream como valores binarios)

    function ReadBoolean: Boolean; virtual;
    function ReadByte: Byte; virtual;
    function ReadBytes(Count: Integer): TBytes; virtual;
    function ReadChar: Char; virtual;
    function ReadChars(Count: Integer): TCharArray; virtual;
    function ReadDouble: Double; virtual;
    function ReadSByte: ShortInt; inline;
    function ReadShortInt: ShortInt; virtual;
    function ReadSmallInt: SmallInt; virtual;
    function ReadInt16: SmallInt; inline;
    function ReadInteger: Integer; virtual;
    function ReadInt32: Integer; inline;
    function ReadInt64: Int64; virtual;
    function ReadSingle: Single; virtual;
    function ReadString: string; virtual;
    function ReadWord: Word; virtual;
    function ReadUInt16: Word; inline;
    function ReadCardinal: Cardinal; virtual;
    function ReadUInt32: Cardinal; inline;
    function ReadUInt64: UInt64; virtual;


Por ejemplo, para leer un parámetro del tipo Boolean de nuestra app, escribiríamos:

...
VAR
  Reader: TBinaryReader;
...
Parametro1:=Reader.ReadBoolean;
...

Y para almacenarlo:



...
VAR
  Writer: TBinaryWriter;
...
Writer.Write(Parametro1);



En la propiedad "StoragePath"  especificamos el Path para almacenar el estado, si no indicamos nada el estado se perderá al reiniciar la app, en caso contrario el estado se grabará en un fichero, en este caso le he llamado "MIARCHIVODEDATOS.tmp".

El procedimiento para la lectura de parámetros sería el siguiente: (yo lo suelo poner en el ONCREATE del form)

PROCEDURE Tform1.LeerArchivoParametros;
VAR
  Reader: TBinaryReader;

BEGIN
  SaveState.Name := 'MIARCHIVODEDATOS.tmp';
// IMPORTANTE al poner tpath.GetHomePath se crea un archivo permanente
// que no se borra cuando se restaura la app

  SaveState.StoragePath := tpath.GetHomePath;

  IF SaveState.Stream.Size > 0 THEN
  BEGIN
    Reader := TBinaryReader.Create(SaveState.Stream);

    TRY

      Parametro1 := Reader.ReadBoolean;
      Parametro2 := Reader.ReadInteger;
      Parametro3 := Reader.ReadString;

    FINALLY
      Reader.Free;
    END;

  END;

END;

y el procedimiento de escritura sería en el evento "ONSAVESTATE" del form de esta manera:

PROCEDURE Tform1.FormSaveState(Sender: TObject);

VAR
  Writer: TBinaryWriter;

BEGIN
  SaveState.Stream.Clear;

  Writer := TBinaryWriter.Create(SaveState.Stream);

  TRY
    Writer.Write(Parametro1);

    Writer.Write(Parametro2);

    Writer.Write(Parametro3);

  FINALLY
    Writer.Free;
  END;
END;


Lo que me ha parecido interesante de esta forma de almacenar los parámetros de una app es que según las pruebas que he hecho, funciona para cualquier S.O., Android, IOS y Windows.
Recordad que si lo usáis en Android, para que funcione bien, previamente tendréis que desinstalar las versiones previas de la app.


Espero que os haya sido útil, 

...hasta el próximo post...

1 comentario: