Also Dein Code oben, gefällt mir ganz und gar nicht.
1.
Das Objekt wird erst im try-Block erzeugt -> schlägt dies fehl, wird es trotzdem freigegeben.
-> Es wird ein Objekt freigegeben, das möglicherweise nicht erstellt wurde.
Besser:
Delphi-Quellcode:
reg := TRegistry.Create;
try
// do something
finally
reg.Free;
end;
2.
Was geöffnet wird, sollte zum Schluss auch wieder geschlossen werden - am Besten das ganze in noch einem try-finally-Block.
Außerdem kann das Öffnen auch fehlschlagen, z.B. wenn es den Schlüssel in der Registry nicht gibt - dafür gibt es eine if-Abfrage:
Delphi-Quellcode:
if reg.OpenKey(...) then
try
// do something
finally
reg.CloseKey;
end;
Das ganze sähe dann so aus:
Delphi-Quellcode:
uses Windows, Registry;
...
procedure TForm1.Button1Click(Sender: TObject);
var
reg : TRegistry;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.OpenKey('SOFTWARE\Policies\Microsoft\Windows\System\Shutdown',true) then
try
reg.WriteInteger('HibernateAsDefault',1);
reg.WriteInteger('ShowHibernateButton',1);
finally
reg.CloseKey;
end;
finally
reg.Free;
end;
end;
//Edit:
zur MessageBox (hat zwar nix mehr mit dem Thema zu tun, aber was soll's...):
verwende mal
Application.MessageBox, wie Du da die Buttons und Symbole als Parameter übergibst, steht in der Delphi-Hilfe.