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.