Mar 13/08/2013 - AutoSave
Posté : mar. 13 août 2013 15:57
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.
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.
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...
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 : Donnée modifiée, sauvegarde automatique activée : Donnée modifiée, sauvegarde automatique désactivée : 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.
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;
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;
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 : Donnée modifiée, sauvegarde automatique activée : Donnée modifiée, sauvegarde automatique désactivée : 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.