Je vous propose quelques exemples de code pour le paramétrage du chemin d'accès au fichier de stockage par défaut des paramètres de vos logiciels lorsque vous utilisez la classe TParams de l'unité Olf.RTL.Params.pas disponible avec ma boite à outil sur GitHub.
Cette classe permet de faire du stockage de paramètres en format JSON, sur toutes les plateformes et tous types de projets pris en charge par Delphi plutôt que de les stocker avec les classes TIniFile ou TRegistry de Windows.
Comportement par défaut : zéro configuration
Le simple fait d'inclure l'unité Olf.RTL.Params.pas dans un projet Delphi permet l'utilisation des méthodes de classe de TParams pour stocker et charger des données en format (clé, valeur) de différents types.
Par défaut le stockage est fait dans un sous-dossier du dossier "Mes Documents" (ou son équivalent selon le système d'exploitation). ce sous-dossier correspond au nom du programme exécuté sans son extension.
Le nom du fichier est également constitué à partir du nom du programme exécuté mais avec l'extension ".par".
Quand on compile le projet en configuration DEBUG, le suffixe "-debug" est ajouté au nom du fichier.
En compilation RELEASE le nom du fichier ne bouge pas.
A la base ça permet de stocker les paramètres de développement et de débogage dans le même dossier de l'ordinateur et éviter les conflits entre les deux versions surtout si on touche à des bases de données de production.
J'avais expliqué tout ça lorsque j'ai mis diffusé la première version de cette unité.
Voyons maintenant comment changer le fichier par défaut et éventuellement modifier l'emplacement lorsqu'on décide de changer l'arborescence de stockage ou le nom du fichier.
Spécifier le nom du fichier ou du dossier de stockage
La classe TParams a plusieurs méthodes pour manipuler le nom du fichier de stockage ou son chemin :
- setFolderName() : permet le changement du dossier de stockage sans changer le nom du fichier
- setFilePath() : permet de changer le chemin de stockage et le nom du fichier
Si vous ne désirez pas stocker vos paramètres dans l'arborescence par défaut il vous suffit donc d'appeler l'une ou l'autre de ces procédures dans l'initialisation d'une unité de votre projet. Par exemple l'unité principale ou celle qui traitera de vos options de configurations.
Par exemple faites :
initialization
TParams.setFolderName(TPath.Combine(TPath.GetDocumentsPath, 'MonDossierDeStockage'));
end.Non seulement ça changera le chemin, mais ça permettra aussi de charger le contenu du fichier correspondant car un appel à Load() est fait par défaut, ce que vous pouvez désactiver et faire à la main si vous le préférez.
Je vous recommande d'en passer par là et de conditionner ce chemin en fonction de la configuration de compilation. En développement (configuration DEBUG), ça ne pose généralement pas de problème de stocker des trucs dans "Mes Documents" de l'utilisateur. En revanche ça peut être gênant pour d'autres personnes, donc une fois de plus distinguez DEBUG et RELEASE dans votre code source.
initialization
{$IF Defined(DEBUG)}
TParams.setFolderName(TPath.Combine(TPath.GetDocumentsPath, 'MonDossierDeStockage'));
{$ELSE IF Defined(RELEASE)}
TParams.setFolderName(TPath.Combine(TPath.GetDocumentsPath, 'MonDossierDeStockage'));
{$ELSE}
{$MESSAGE FATAL 'TParams folder not set'}
{$ENDIF}
end.Ajouter un message plantant la compilation dans les cas que vous ne gérez pas est une bonne habitude. Ca évite les surprises dans la durée ou selon les configurations de l'environnement de travail.
Maintenant que vous savez comment fixer le dossier ou fichier de stockage, voyons comment le modifier une fois le logiciel en circulation.
Déplacer le fichier de stockage
Pour une raison ou une autre votre nom de projet peut évoluer. Comme c'est sur ce nom qu'est basé le nom du fichier de paramétrage par défaut, ça peut avoir des effets de bord inattendus.
Vous pouvez aussi avoir envie de passer d'une arborescence à une autre, que vous ayez déjà personnalisé celle-ci ou pas.
Dans ce but nous avons ajouté la méthode MoveToFilePath() à la classe TParams. Cette méthode change le nom et le chemin du fichier de paramétrage tout en déplaçant l'actuel au nouvel emplacement.
Un exemple est fourni avec l'unité : il déplace le fichier du dossier "Mes Images/temp" vers le dossier "Mes Documents/Temp" dans le cas où le fichier existait déjà de la précédente version du programme.
procedure initParamsFile;
var
NewFolder, OldFolder, FileName: string;
begin
OldFolder := tpath.Combine(tpath.GetPicturesPath, 'temp');
NewFolder := tpath.Combine(tpath.GetDocumentsPath, 'temp');
FileName := tpath.GetFileName(tParams.getFilePath);
if tfile.Exists(tpath.Combine(OldFolder, FileName)) then
begin
tParams.setFolderName(OldFolder);
tParams.MoveToFilePath(tpath.Combine(NewFolder, FileName), true, true);
end
else
tParams.setFolderName(NewFolder);
end;
initialization
initParamsFile;
end.Ca fonctionne bien entendu aussi pour le fichier de configuration par défaut. Il suffit de remplacer l'affectation de OldFolder par
OldFolder := tpath.getDirectoryName(tParams.getFilePath);Il est préférable de le faire sous forme de procédure. Ca permet de ne pas garder l'allocation de la zone mémoire des chaînes tout au long du programme alors qu'elles ne servent que là.
Voici un autre exemple utilisé dans le jeu vidéo DAD48 qui a déjà été déployé sur plusieurs centaines d'appareils. Perdre les paramètres de configuration n'aurait pas été catastrophique puisque ça consiste essentiellement en l'activation de la musique d'ambiance et des bruitages dans le jeu, mais tant qu'à faire, autant faire les choses proprement.
procedure initParamsUnit;
var
NewPath, OldPath, FileName, NewFilePath: string;
begin
{$IF Defined(DEBUG)}
NewPath := tpath.combine(tpath.GetDocumentsPath, tpath.combine('GAMOLF-debug',
'DAD48'));
{$ELSE if Defined(RELEASE)}
NewPath := tpath.combine(tpath.GetHomePath, tpath.combine('GAMOLF', 'DAD48'));
{$ELSE}
{$MESSAGE FATAL 'setup problem'}
{$ENDIF}
FileName := tpath.getfilename(tParams.getFilePath);
NewFilePath := tpath.combine(NewPath, FileName);
if (tfile.Exists(NewFilePath)) then
tParams.setfoldername(NewPath)
else
begin
OldPath := tpath.getDirectoryName(tParams.getFilePath);
if tfile.Exists(tpath.combine(OldPath, FileName)) then
tParams.MoveToFilePath(NewFilePath, false, true)
else
tParams.setfoldername(NewPath);
end;
end;S'agissant d'un logiciel diffusé dans le grand public, sans base de données, la distinction DEBUG / RELEASE n'est pas forcément utile, mais je l'ai faite car les scores sont susceptibles d'être partagés en ligne, donc avec des codes d'authentification différents selon le type de compilation. C'est plus facile à gérer quand on est serein sur le nom du fichier traité.
L'ancien fichier de configuration (ou plutôt l'actuel jusqu'à la mise à jour du programme) est dans le dossier "Mes Documents / DAD48" avec le nom par défaut, donc "DAD48.par" ou "DAD48-debug.par".
Ces deux fichiers sont déplacés dans deux arborescences distinctes dans la nouvelle version :
- "Mes Documents / GAMOLF-debug / DAD48" pour la version de développement des programmes
- "Application Data / AppRoaming / GAMOLF / DAD48" pour la version de production. "Application Data / AppRoaming" étant sous Windows et adapté selon la plateforme cible par TPath.GetHomePath de System.IOUtils. Pas de raison que l'utilisateur y accède facilement ou le retrouve mélangé avec ses propres fichiers.
Notez une différence minime mais qui a son importance entre les deux versions:
- dans la première je teste si je dois faire un déplacement de l'ancien fichier et s'il n'existe pas je bascule sur le nouveau nom
- dans la seconde je commence par regarder si le fichier de paramètre actuel existe avant de me poser la question d'une éventuelle version antérieure à déplacer
C'est pas grand chose mais étant fait à chaque lancement du programme, mieux vaut partir du principe qu'on exécute le plus souvent ce qui a des chances d'arriver plutôt que de faire un test inutile à chaque lancement du programme alors que le déplacement a déjà été fait la seule fois où il devait l'être.
Donc vous l'aurez compris je vous recommande la seconde approche.



