Home » Tutorials » VCL » Registry

Registry

Lesen aus der Registry

Das Lesen von Daten aus der Registry gestaltet sich nicht sehr viel anders als das Schreiben. Statt der Write-Methoden werden die Read-Methoden verwendet. Das Ganze sieht dann so aus:

uses Registry;

procedure TForm1.FormCreate(Sender: TObject);
var regist: TRegistry;
begin
  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    regist.OpenKey('SoftwareMeineFirmaMeinProgramm1.0', true);
    Form1.Left := regist.ReadInteger('Left');
    Form1.Top := regist.ReadInteger('Top');
  finally
    regist.free;
  end;
end;

Den Read-Methoden (hier ReadInteger) wird in Klammern der Name des Wertes übergeben, der ausgelesen werden soll. Dieser Wert wird dann, wie bei Funktionen üblich, als Ergebniswert zurückgeliefert.
Nun könnte es sein, dass es sich beim Ausführen obiger Methode um den ersten Programmstart handelt, der Schlüssel MeineFirmaMeinProgramm1.0 also noch gar nicht existiert. Da wir bei OpenKey als zweiten Parameter „true“ angegeben haben, wird der Schlüssel dadurch erzeugt. Die Werte „Left“ und „Top“ gibt es aber nach wie vor nicht und können deshalb auch nicht ausgelesen werden. In solchen Fällen löst die Laufzeitumgebung eine Exception (ERegistryException) aus. Am saubersten ist es, vor dem Lesen zu prüfen, ob der gewünschte Key existiert. Die Funktion „OpenKey“ gibt true zurück, wenn der gewünschte Schlüssel vorhanden ist, ansonsten false. Das Vorhandensein einzelner Werte lässt sich mit „ValueExists“ prüfen:

uses Registry;

procedure TMainForm.FormCreate(Sender : TObject);
var
  regist: TRegistry;
begin
  // Default-Werte setzen, falls Werte nicht in Registry vorhanden
  Form1.Left := 0;
  Form1.Top := 0;

  regist := TRegistry.Create;
  try
    regist.RootKey := HKEY_CURRENT_USER;
    if regist.OpenKey('SoftwareMeineFirmaMeinProgramm1.0', false) then
    begin
      try
        // Prüfen, ob Wert "Left" vorhanden
        if regist.ValueExists('Left') then
          Form1.Left := regist.ReadInteger('Left');

        // Prüfen, ob Wert "Top" vorhanden
        if regist.ValueExists('Top') then
          Form1.Top := regist.ReadInteger('Top');
      finally
        regist.CloseKey;
      end;
    end;
  finally
    regist.Free;
  end;
end;

Besonderheiten bei Windows NT/2000/XP und neuer

Wie bereits erwähnt, können unter NT-Systemen nur Anwender mit Administrator-Rechten auf den HKEY_LOCAL_MACHINE-Schlüssel der Registry schreibend zugreifen. Wird also in einem Programm der Schreibzugriff auf diesen Schlüssel verwendet, sollte try-except verwendet werden, um ein mögliches Fehlschlagen abzufangen.
Auch das Lesen aus diesem Schlüssel ist unter NT nicht ganz problemlos. Über die oben vorgestellte Möglichkeit versucht Delphi immer, Vollzugriff (lesen und schreiben) zu erlangen. Ist das nicht möglich, weil ein NT-User keine Administrator-Rechte hat, tritt eine Exception auf. Da das Lesen von HKLM jedoch allen NT-Usern möglich ist, müssen wir Delphi klar machen, dass wir in diesem Fall keinen Vollzugriff, sondern nur Lesezugriff wollen. Das geht so:

regist := TRegistry.Create(KEY_READ);

Weitere Möglichkeiten zum Thema Zugriffsrechte sind in der Delphi-Hilfe unter TRegistry.Access zu finden.