Lire une clef de type reg_multi_sz avec un tregistry

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

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.