Mar 13/08/2013 - AutoSave

Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Mar 13/08/2013 - AutoSave

Message non lu par Xavier »

AutoSave - Part 1


La phase 1 décrite ici est opérationnelle.

Le système repose sur deux nouvelles variables globales, une pour les options, une pour les données. Plutôt que d'utiliser des flags, ce sont des DateTime, il en faudra de toute façon pour la phase 2. Par défaut ces variables valent 999999, une date qui en Delphi correspond au 25/11/4637, ce qui nous laisse du temps.

Si l'un des deux arbres a été modifié, sa variable est mise à jour avec la date et heure de modification, mais uniquement si elle valait encore 999999. Des modifications ultérieures ne modifieront plus une variable déjà différente de 999999. Mais après une sauvegarde de fichier, la variable correspondante est réinitialisée à 999999.

Deux services d'analyse et de mise à jour de ces variables ont été créés et branchés dans 9 méthodes de gestion des données, dont 2 nouvelles qui servent à ajouter (ou insérer) et assigner des textes entiers. Désormais toute opération sur un des arbres de données peut impacter les variables de modification.

Code : Tout sélectionner

//------------------------------------------------------------------------------
// XT400 / Modified - Met à jour XV_ModOptions ou XV_ModData si besoin
//------------------------------------------------------------------------------
procedure TData.Modified;
var
	Ancestor: TData;
begin
	// Préparation
	Ancestor := Self.GetAncestor;

	// Arbre des options
	if	((Ancestor = XD_Kernel) and (XV_ModOptions = 999999))
	then	XV_ModOptions := Now;

	// Arbre des données
	if	((Ancestor = XV_Data) and (XV_ModData = 999999))
	then	XV_ModData := Now;
end;
Tous les appels de type "Data.Text.Add(" et Data.Text.Assign(" ont été remplacés par les nouveaux services "Data.AddText(" et "Data.AssignText(" qui eux font gentiment un appel aux services de modifications.

Code : Tout sélectionner

//------------------------------------------------------------------------------
// XT400 / AssignText - Assigne une liste de chaines à Text
//------------------------------------------------------------------------------
procedure TData.AssignText(Strings: TStrings);
begin
	// Assignation de la liste de chaines
	Self.Text.Assign(Strings);

	// Gestion des modifications
	Self.Modified;
end;
Finalement ce système est un vrai succès, car tout le code de gestion des modifications est réuni dans l'unité de gestion des données TData, les outils n'ont à s'occuper de rien à condition qu'ils utilisent bien les services ! Le cauchemar tant redouté qui consistait à devoir coder des "Modified := True" dans des centaines d'endroits a été évité. Ahhh, la magie de l'objet... :D


Les 2 services de mise à jour des variables sont également chargés de mettre à jour le bouton sur la Barre :
Pas de donnée modifiée :
SaveGray.png
Donnée modifiée, sauvegarde automatique activée :
SaveGreen.png
Donnée modifiée, sauvegarde automatique désactivée :
SaveRed.png
En utilisation normale, le bouton sera donc majoritairement gris, ou vert quand des données ont été modifiées et avant que le système ne déclenche un Save.
Le bouton ne reflète finalement pas l'état des options, parce que chaque repositionement de fenêtre les modifie et le bouton devenait trop vite coloré, donc elles seront sauvées en "underground" par un process non visible.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Xavier
Administrateur du site
Messages : 817
Enregistré le : mer. 22 juin 2011 18:25

Mar 13/08/2013 - AutoSave

Message non lu par Xavier »

AutoSave - Part 2


Sans surprise, la phase 2 a été rapide.
Le Moteur vérifie chaque seconde si les options et les données doivent être sauvées, et si oui il le fait ce qui réaffiche le bouton gris via la chaîne de services imbriqués.

Code : Tout sélectionner

//------------------------------------------------------------------------------
// XT400 / Auto_Save
//------------------------------------------------------------------------------
procedure Auto_Save;
begin
	// Sauvegarde des options si modifiées il y a plus d'une minute
	if	Now > (XV_ModOptions + XC_Minute)
	then	XSK_Save('Options');

	// Sauvegarde des données si modifiées il y a plus d'une minute
	if	Now > (XV_ModData + XC_Minute)
	then	XSK_Save('Data');
end;
Il faut maintenant réfléchir à la gestion des archives de la phase 3.
Répondre