Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008
-
13 févr. 2005 à 16:54
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008
-
21 févr. 2005 à 19:21
Salut !!
En sachant que j'ai deux CheckBox, et que je veux lire la valeur de NoClose qui est dans
(HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer),
comment puis-je faire pour qu'un CheckBox soit coché en fonction de
la valeur de la clé? (Par exemple que si la valeur est égale à 1, le
CheckBox 1 soit coché, et si la valeur est égale à 0 ou n'existe pas le
CheckBox2 soit coché.)
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 14 févr. 2005 à 22:15
C'est tout à ton honneur de trouver des codes plus courts et plus efficaces !
<OL>
<LI>Il est conseillé de mettre CloseKey, ça fait plus "propre" </LI>
<LI>Try…Finally…End est une commande qui permet de s'assurer que les lignes de code contenues entre Finally et End seront exécutées même si le code génère une erreur entre try et finally. Je suis désolé, mais dans tous les codes que je t'ai donné en exemple, j'ai omis le Free, cependant nécessaire… (je l'avais mis dans le Finalization de ma form, donc je n'y ai pas pensé en te donnant le code… Encore désolé, c'est une erreur de débutant…). Ce Free permet de libérer l'objet registre créé de la mémoire.</LI>
<LI>Une procedue renvoyant un résultat s'appelle une fonction. Voici deux exemples de fonctions, l'une renvoyant un integer (la value de la valeur : si value= 1 renvoie 1 // sinon, si value=0 ou n'existe pas, renvoie 0), et l'autre un boolean (si value=0 ou n'existe pas renvoie False // sinon renvoie True). </LI></OL> function lit_valeur_registre_renvoievalue(SelectRootKey: HKEY; SelectKey: string; Value: string): integer;
begin with TRegistry.Create do begin try RootKey : = SelectRootKey;
OpenKey(SelectKey, false);
if (ValueExists(Value)) and (GetDataType(Value)= rdInteger) then
result : = ReadInteger(Value)
else result := 0;
CloseKey;
finally
Free;
end;
end;
end;
function lit_valeur_registre_renvoiebool(SelectRootKey: HKEY; SelectKey: string; Value: string): boolean;
begin with TRegistry.Create do begin try RootKey : = SelectRootKey;
OpenKey(SelectKey, false);
if (ValueExists(Value)) and (GetDataType(Value)= rdInteger) then
result : = (ReadInteger(Value)= 1)
else
result : = false;
CloseKey;
finally Free;
end;
end;
end;
Je pense que la deuxième te conviendra mieux car il te suffira d'écrire ceci pour actualiser le statut de tes RadioButtons :
RadioButton1.Checked := lit_valeur_registre_renvoiebool(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', 'NoClose');
Plutôt que de devoir faire ceci pour la première : RadioButton 1.Checked :(lit_valeur_registre_ renvoievalue (HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', 'NoClose') 1);
Cela ne fait pas une grosse différence, mais je te donne différentes façons de faire pour que tu puisses t'en servir plus tard (on ne sait jamais !)
Un autre conseil : mets False partout ou tu vois OpenKey(Key, CANCREATE). C'est plus sécurisant. En effet, si tu tapes mal le nom de la clé ou si la clé n'existe pas sur un ordinateur, cela empêchera la création automatique de la clé, autorisée dans ton code par True.
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 févr. 2005 à 17:15
désolé j'ai fait une erreur :
CheckBox1.Checked := (StrToInt(reg.ReadString('NoClose'))=1);
CheckBox2.Checked := not (StrToInt(reg.ReadString('NoClose'))=1);
j'ai oublié d'enlever les ' ' après avoir mis les StrToInt...
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 févr. 2005 à 19:10
Essaie en enlevant les StrToInt et en rajoutant les ' '. En effet, StrToInt plante quand une chaîne de 0 caractères est en paramètre, ce qui est le cas quand la clé n'existe pas. Remplace par ceci :
CheckBox1.Checked := (reg.ReadString('NoClose')='1');
CheckBox2.Checked := not (reg.ReadString('NoClose')='1');
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 13 févr. 2005 à 19:20
merci nico, ça marche, mais uniquement quand la clé NoClose n'existe pas, quand elle existe, ça ne marche que quand la valeur est égale à 0
quand la valeur est égale à 1, j'ai le message d'erreur "Invalid data type for NoClose"
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 13 févr. 2005 à 21:12
J'étais parti du principe que ta clé NoClose était une valeur chaîne, du coup, je l'ai lue avec ReadString et j'ai mis le 1 et le 0 entre ' '. D'après ce que tu me dis, cela est un autre type de valeur. Si c'est une valeur DWord (comme je pense le comprendre), alors tu dois utiliser ReadInteger et enlever les ' '.
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 13 févr. 2005 à 21:29
j'ai donc mis ce code là :
CheckBox1.Checked := (reg.ReadInteger ('NoClose')=1);
CheckBox2.Checked := not (reg.ReadInteger ('NoClose')=1);
mais du coup, il ne marche que quand la clé est égale à 1
et j'ai ce message :
Failed to get data for 'NoClose'
sinon oui, c'est une valeur dword
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 13 févr. 2005 à 22:25
je crois que j'ai compris, j'ai ce message d'erreur quand la clé
n'existe pas, sinon quand la valeur est égale à 0 ou 1 ça marche, il me
reste juste à trouver le code pour quand la clé n'existe pas
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 14 févr. 2005 à 10:59
merci nico, c'est génial, t'es vraiment super sympas
il y a juste un truc, c'est que quand la valeur est égale à 1 ou à
684554, enfin n'importe quel nombre au-dessus de 0, le résultat est le
même que si la valeur était 1, mais je te l'avais pas dis, donc j'ai
juste du modifier deux ligne comme ça :
CheckBox1.Checked := not (reg .ReadInteger('NoClose')=0);
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 14 févr. 2005 à 11:14
mais une dernière chose, comment faire pour que le programme ne lise la
valeur uniquement si c'est une valeur dword, car si la valeur est
binaire ou chaîne, le programme ne marche plus?
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 14 févr. 2005 à 11:29
Message 1 : Tu fais comme tu veux mais ça revient exactement au même : Chez moi il n'y a pas d'erreur avec des nombres supérieurs à 1, ça coche bien la CheckBox2 comme prévu Bizarrerie informatique...
Message 2 : Il faut faire comme ça :
if (reg.ValueExists('NoClose')) and (reg.GetDataType('NoClose')=rdInteger) then
[...]
mais y-a-t-il beaucoup de chance pour que ta clé ne soit pas une D_Word, étant donné que c'est toi qui la modifie ? Tu es sensé savoir ce que tu fais
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Maniaxman
Messages postés155Date d'inscriptionlundi 10 janvier 2005StatutMembreDernière intervention17 juillet 2008 14 févr. 2005 à 12:33
Merci nico, maintenant je voudrais mettre des RadioButton au lieu des checkbox, pas très difficile.
Et quand on coche le RadioButton1 ou 2, la valeur de NoClose devient 0 ou 1, je voudrais juste savoir comment modifier une valeur, merci.