Suggestion modification FAQ
Hello,
Ce message sera à déplacer par un modérateur dans sa bonne rubrique !
Tout d'abord, je tiens à dire un grand bravo à tous les développeurs qui contribuent à la qualité de la FAQ Delphi.
Je voudrais vous faire une suggestion de modification de code pour la FAQ :
Comment sauvegarder la base de registre ?
Première remarque :
-------------------
Son éxécution est contraignante dans le sens où elle oblige à saisir un TimeOut comme paramètre. J'ai testé sur plusieurs stations et cela oblige a ajuster pour chacune d'elle ce paramètre. Dans le cas d'une application diffusée au public cela devient pratiquement impossible à paramétrer un délai standard à moins de mettre un délai de plusieurs dizaines de secondes pour palier tous les cas possibles mais cela pénalise alors ceux qui ont des processeurs rapides. Il est donc préférable d'inclure un 'WAIT_TIMEOUT' au niveau du WaitForSingleObject.
Deuxième remarque :
-------------------
Le curseur de recherche s'efface alors que le traitement n'est pas encore terminé etcela fait penser à un possible plantage mais ce n'est pas le cas.
Il serait préférable d'inclure la gestion du curseur afin d'avoir jusqu'à la fin l'affichage du curseur de recherche.
Voici mon code modifié qui corrige ces deux points.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
//=================================================================
procedure SaveRegister(sFileName : SHortString);
//=================================================================
// sFileName est le chemin et le nom de fichier à créer
//(ex:'C:\TestSave.reg')
Var
StartInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Fin: Boolean;
oldCursor : TCursor;
Begin
//Gestion du curseur
oldCursor := Screen.Cursor; // On enregistre le curseur utilisé
Screen.Cursor := crHourglass; // On le remplace par le sablier (ou le cercle pour Vista)
// Mise à zéro de la structure StartInfo
FillChar(StartInfo, SizeOf(StartInfo), #0);
// Seule la taille est renseignée, toutes les autres options }
// laissées à zéro prendront les valeurs par défaut }
StartInfo.cb := SizeOf(StartInfo);
// Lancement de la ligne de commande
If CreateProcess(Nil, PChar('regedit.exe /se ' +sFileName),
Nil, Nil, False, 0, Nil, Nil, StartInfo, ProcessInfo) Then begin
// L'application est bien lancée, on va en attendre la fin
// ProcessInfo.hProcess contient le handle du process principal de l'application
Fin:=False;
Repeat
// On attend la fin de l'application
Case WaitForSingleObject(ProcessInfo.hProcess, 200)Of
WAIT_OBJECT_0 :Fin:=True; // L'application est terminée, on sort
WAIT_TIMEOUT :; // elle n'est pas terminée, on continue d'attendre
End;
//Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée.
Application.ProcessMessages;
Until Fin;
//La sauvegarde terminée
ShowMessage('La sauvegarde du registre est terminée.');
// On Remet le curseur.
Screen.Cursor := oldCursor;
End
Else RaiseLastOSError;
end; |
Bonne journée à tous