So, ich habe es!
Zwar nicht in ein OpenArray sondern in eine TStringlist, das ist sogar besser (Siehe Code unter Debug)
Ich bekomme, wenn ich die Zeile Val.free einsetze, (mit Try oder ohne Try...finally..end) eine EAccessviolation Meldung.
-> Was mache ich falsch?
Ganz unten das Beispiel aus der DelphiHilfe, da funktioniert es.
Hier mein Code/meine Lösung:
Nachtrag: Gelöst dank Björn, siehe Code hier:
Delphi-Quellcode:
...uses Registry
//Meine Lösung...
function CountKey(Rootkey:HKEY;Key:String):Integer;
VAR Reg: TRegistry;
Val: TStringList;
i: Integer;
begin
// INIT
Result:=0;
Reg:=TRegistry.Create;
//INITEND
//Hauptteil:
try
Val:=TStringList.Create;
reg.RootKey:=Rootkey;
if not Reg.OpenKey(Key,False)
then ShowMessage('Error opening key')
else
begin Reg.GetValueNames(Val);
//ONLY FOR DEBUG Zur INFO: (* einfach durch //(* ersetzen und sehen was passiert!
(*
for I:=0 to Val.Count-1 do
begin ShowMessage(Key+ Chr(13) +'hat einen Eitrag'+Val.Strings[I]+Chr(13)+
'mit '+Reg.ReadString(Val.Strings[I]));
end;//ENDFOR
*)
//DEBUGEND
end;//ELSE
// EDIT Das ist der alte Code der nicht funtionierte
(*
finally
//Hier gibt es ein Error!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Val.free;
end;
Reg.free;
//Hier das Ergebnis der Suche
Result:=Val.Count;
// Alter Code ENDE
*)
// EDIT So ist es richtig!
Result:=Val.Count;
finally
Val.free;
end;
Reg.free;
end;
//Aufruf mit...
procedure TForm1.Button1Click(Sender: TObject);
var RootKey:HKEY;
key:String;
begin
RootKey:=HKEY_LOCAL_MACHINE;
key:='\Software\Microsoft\Windows\CurrentVersion\Run';
showmessage(inttostr(countkey(RootKey,key)));
end;
::::: Hier das Beispiel aus der Delphi Hilfe...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegistry;
Val:TStringList;
I:Integer;
begin
Reg:=TRegistry.Create;
try
Val:=TStringList.Create;
try
Reg.RootKey:=HKEY_LOCAL_MACHINE; // Abschnitt in Registrierung
if not Reg.OpenKey(Edit1.Text,False) then
ShowMessage('Error opening key')
else
begin
Reg.GetValueNames(Val);
for I:=0 to Val.Count-1 do
begin
ShowMessage(Edit1.Text + Chr(13) +
'has an Entry Called '+Val.Strings[I]+Chr(13)+
'With a Value of '+Reg.ReadString(Val.Strings[I]));
end;
if MessageDlg('Ok to delete the key and lose all these values?'
,Mtinformation,[mbYes,mbNo],0)=mryes then
Reg.DeleteKey(Edit1.Text);
end;
finally
Val.Free;
end;
finally
Reg.Free;
end;
end;