Lire une valeur dans le registre [Résolu]

Signaler
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008
-
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008
-
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é.)

!! NoClose est une clé.



Merci d'avance

25 réponses

Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Voici le code complet qui devrait (enfin !) marcher :

uses Registry;

procedure Coche;
var
reg : TRegistry;
begin
reg := TRegistry.create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', false);
if reg.ValueExists('NoClose') then
begin
CheckBox1.Checked : = (reg .ReadInteger('NoClose')= 1); CheckBox2.Checked :not (reg.ReadInteger('NoClose')1);
end
else
begin
CheckBox1.Checked := false;
CheckBox2.Checked := true;
end;
reg.closeKey;
end;


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
procedure TForm1.RadioButton1Click(Sender: TObject);
var
reg : TRegistry;
begin
reg := TRegistry.create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', false);
reg.WriteInteger('NoClose',1);
reg.closeKey;
end ;
procedure TForm1.RadioButton2Click(Sender: TObject);
var
reg : TRegistry;
begin
reg : = TRegistry.create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', false);
reg.WriteInteger('NoClose',0);
reg.closeKey;
end;

Voilà


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
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>TryFinallyEnd 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 !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
lol japee
d'un certain côté on est là pour ça
C'est vrai qu'une petite "Réponse acceptée" me ferait plaisir

@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
procedure TForm1.valeur_registre(SelectRootKey: HKEY; SelectKey: string; NewValueName: string; Value: integer);
begin
with TRegistry.Create do
begin
try
RootKey := SelectRootKey;
OpenKey(SelectKey, True);
Writeinteger(NewValueName, Value);
CloseKey;
finally
Free;
end;
end;
end;

Voilà


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
uses Registry;

var
reg : TRegistry;

procedure coche;
var
demarre : string;
begin
reg := TRegistry.create;
reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer', false);
CheckBox1.Checked := (StrToInt(reg.ReadString('NoClose'))='1');
CheckBox2.Checked := not (StrToInt(reg.ReadString('NoClose'))='1');
reg.closeKey;
end;


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
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 !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
oula chui pas réveillé moi....... ça doit être les vacances !

var
demarre : string;
ne sert bien évidement a rien....
encore désolé


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

merci d'avoir répondu si vite Nico, mais au lancement de l'application il me met ce message d'erreur : "" is not a valid integer value
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
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 !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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"
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
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 !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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);

CheckBox2.Checked := (reg.ReadInteger('NoClose')=0);



voilà, et merci beaucoup
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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?
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
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 !
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

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.
Messages postés
155
Date d'inscription
lundi 10 janvier 2005
Statut
Membre
Dernière intervention
17 juillet 2008

Merci beaucoup Nico !!!!!!!!!!
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !