Lire une valeur dans le registre

Résolu
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008 - 13 févr. 2005 à 16:54
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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é.)

!! NoClose est une clé.



Merci d'avance

25 réponses

ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
13 févr. 2005 à 23:27
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 !
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
14 févr. 2005 à 12:48
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 !
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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>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 !
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 16:16
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 !
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
19 févr. 2005 à 12:10
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 !
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
13 févr. 2005 à 17:14
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 !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
13 févr. 2005 à 17:17
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 !
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
13 févr. 2005 à 17:24
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
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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"
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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);

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



voilà, et merci beaucoup
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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?
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 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.
0
Maniaxman Messages postés 155 Date d'inscription lundi 10 janvier 2005 Statut Membre Dernière intervention 17 juillet 2008
14 févr. 2005 à 12:56
Merci beaucoup Nico !!!!!!!!!!
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
14 févr. 2005 à 13:14
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
Rejoignez-nous