Lire une clef de type reg_multi_sz avec un tregistry

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 260 fois - Téléchargée 34 fois

Contenu du snippet

C'est en réponse à une question du Forum.

Voici une procédure pour lire une valeur de type REG_MULTI_SZ à l'aide d'un TRegistry.

Ce n'est possible qu'en lecture car le TRegistry ne peut créer de valeur REG_MULTI_SZ. Mais c'est peut-être suffisant pour certains.

Pour essayer le source ci-dessous il suffit d'ajouter un bouton et un memo sur une fiche.

Source / Exemple :


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

Uses Registry;
{$R *.dfm}

Procedure LectureREG_MULTI_SZ(Reg:TRegistry;Valeur:String;Valeurs:TStrings);
Var Buf    : Array Of Byte;
    Taille : Integer;
    i      : Integer;
    Chaine : String;
Begin
  // On efface la liste
  Valeurs.Clear;
  // On recherche la taille des données
  Taille:=Reg.GetDataSize(Valeur);
  If Taille>0
  Then Begin
    // Ajustement du tableau à la taille reçue
    SetLength(Buf,Taille);
    // Lecture des valeurs sous forme binaire
    Reg.ReadBinaryData(Valeur,buf[low(Buf)],Taille);
    // Conversion des chaines AZT multiples en TStrings
    Chaine:='';
    // Taille-2 au lieu de Taille-1 pour ignorer le double zéro final
    For i:=0 To Taille-2 Do
    Begin
      If Buf[i]=0
      Then Begin
        Valeurs.Add(Chaine);Chaine:='';
      End
      Else Begin
        Chaine:=Chaine+Char(Buf[i]);
      End;
    End;
    // Libération du tableau
    Buf:=Nil;
  End;
End;

procedure TForm1.Button1Click(Sender: TObject);
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\Essai\', False) then
    begin
      LectureREG_MULTI_SZ(Reg,'VALEUR',Memo1.Lines);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

end.

Conclusion :


Je n'ai essayé que sous XP, (W95 W98 et WMe n'ont pas de valeurs de type REG_MULTI_SZ ) mais je pense que ça fonctionne pareil avec W2000.

A voir également

Ajouter un commentaire

Commentaires

ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
7 -
je profite d'une récente question sur le forum pour donner une solution d'écriture :D
Voir ce site :
http://qc.borland.com/wc/qcmain.aspx?d=23428

@+
Nico
cs_Nono40
Messages postés
1000
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
1 -
Je n'ai jamais essayé d'écrire. Je pense qu'il faut passer par les API pour écrire ce type de Valeur. En attendant que Delphi les prennent en compte.
nakos91
Messages postés
13
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
11 novembre 2010
-
ET POUR ECRIRE ON FAIT COMMENT ???? sinon c'est très bien et très util

Nakos91
cs_jado
Messages postés
25
Date d'inscription
jeudi 18 juillet 2002
Statut
Membre
Dernière intervention
18 mai 2008
-
Grrrrrr j'ai Windows 98 :(

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.