Помогите пожалуйста, уже не знаю что делать
Надо найти в выбранных чекбоксами разделах ключи, в значении у которых прописан адрес файла или каталога и проверить его наличие на диске. Если его не существует, то надо вывести ключ в список.
Сразу при вызове процедуры ScanKey появляется ошибка. (я ставил красную точку

на exist:=true
First chance exception at $755DB9BC. Exception class EAccessViolation with message 'Access violation at address 00444002 in module 'Project1.exe'. Read of address 00000008'. Process Project1.exe (4776)
Код:
procedure TForm1.Button3Click(Sender: TObject);
begin
try
if cbHKEY_CLASSES_ROOT.Checked then
begin
FReg.RootKey := HKEY_CLASSES_ROOT;
ScanKey('');
end;
if cbHKEY_CURRENT_USER.Checked then
begin
FReg.RootKey := HKEY_CURRENT_USER;
ScanKey('');
end;
if cbHKEY_LOCAL_MACHINE.Checked then
begin
FReg.RootKey := HKEY_LOCAL_MACHINE;
ScanKey('');
end;
if cbHKEY_USERS.Checked then
begin
FReg.RootKey := HKEY_USERS;
ScanKey('');
end;
if cbHKEY_CURRENT_CONFIG.Checked then
begin
FReg.RootKey := HKEY_CURRENT_CONFIG;
ScanKey('');
end;
finally
end;
end;
procedure TForm1.PrintKey(const AKey, AValue, AData: String);
var
Find: Integer;
p: string;
begin
if FReg.GetDataType(AValue)= rdString then p:= 'REG_SZ (STRING)';
if FReg.GetDataType(AValue)= rdExpandString then p:= 'REG_EXPAND_SZ (ExpandString)';
// Application.ProcessMessages;
with ListView3.Items.Add do
begin
Caption := AKey;
SubItems.Add(p);
SubItems.Add(AData);
end;
end;
procedure TForm1.ScanKey(Key: String);
var
S: TStringList;
I: Integer;
Stmp:string;
exist:boolean;
begin
exist:=true;
if FReg.OpenKeyReadOnly(Key) then
try
S := TStringList.Create;
try
FReg.GetValueNames(S);
for I := 0 to S.Count - 1 do
if (FReg.GetDataType(S.Strings[i]) in [rdString, rdExpandString])
and (copy(FReg.ReadString(S.Strings[i]),2,2)=':\') then
begin
try exist:=fileexists(FReg.ReadString(S.Strings[i]))
except
exist:=DirectoryExists(FReg.ReadString(S.Strings[i]));
end;
if not exist then PrintKey(Key, S.Strings[i], FReg.ReadString(S.Strings[i]));
exist:=true;
end;
S.Clear;
FReg.GetKeyNames(S);
for I := 0 to S.Count - 1 do
if S.Strings[i] <> '' then
ScanKey(Key + '\' + S.Strings[i]);
finally
S.Free;
end;
finally
FReg.CloseKey;
end;
end;
Admin: Пользуемся тегами для оформления кода!