[Powa?żny problem]Wyszukiwanie danych w rejestrze

0

mam taki kodzik:

var
  Reg: TRegistry;
  StartTime: Cardinal;

  function FixupPath(Key: string): string;
  begin
    if Key = '' then
      Result := ''
    else
      if AnsiLastChar(Key) <> '' then
        Result := Key + ''
      else
        Result := Key;
    if Length(Result) > 1 then
      if (Result[1] = '') and (Result[2] = '') then
        Result := Copy(Result, 2, Length(Result));
  end;

  procedure SearchReplace(StartKey: String);
  var
    KeyNames, ValueNames: TStringList;
    I: Integer;
    Current, Changed: String;
  begin
    Application.ProcessMessages;
    Reg.CloseKey;
    Reg.OpenKey(FixupPath(StartKey), False);
    ListBox1.Items.Add('Key:'+FixupPath(StartKey));
    KeyNames:=TStringList.Create;
    ValueNames:=TStringList.Create;
    Reg.GetValueNames(ValueNames);
    if not ValueNames.Count=0 then
      begin
        for I:=0 to ValueNames.Count-1 do
          begin
            if Reg.GetDataType(ValueNames.Strings[I])=rdString then
              begin
                Current:=Reg.ReadString(ValueNames.Strings[I]);
                if Pos(AnsiUpperCase(
                  'C:\Documents and Settings\Hubert\Pulpit\Delphi'),
                  AnsiUpperCase(Current))<>0 then
                  begin
                    ListBox1.Items.Add('Value:'+ValueNames.Strings[I]);
                    Changed:=StringReplace(Current, 'C:\Documents and Settings\Hubert\Pulpit\Delphi',
                    'G:\Delphi', [rfReplaceAll, rfIgnoreCase]);
                    Reg.WriteString(ValueNames.Strings[I], Changed);
                  end;
              end;
          end;
      end;
    if Reg.HasSubKeys then
      begin
        Reg.GetKeyNames(KeyNames);
        if not KeyNames.Count=0 then
          begin
            for I:=0 to KeyNames.Count do
              begin
                SearchReplace(FixupPath(StartKey)+FixupPath(KeyNames.Strings[I]));
              end;
          end;
      end;
    ValueNames.Free;
    KeyNames.Free;
  end;

begin
  Reg:=Tregistry.Create;
  StartTime:=GetTickCount;
  Reg.RootKey:=HKEY_CURRENT_USER;
  ListBox1.Items.Add('HKEY_CURRENT_USER:');
  SearchReplace('');
  Reg.RootKey:=HKEY_LOCAL_MACHINE;
  ListBox1.Items.Add('HKEY_LOCAL_MACHINE:');
  SearchReplace('');
  Reg.RootKey:=HKEY_USERS;
  ListBox1.Items.Add('HKEY_USERS:');
  SearchReplace('');
  ListBox1.Items.Add('Done after: '+IntToStr(StartTime-GetTickCount)+' msec!');
  Application.MessageBox('Done','Reg Search & Replace', MB_OK);
end;

Kompiluje się toto pieknie, ale nie działa! z logów (ListBox1) wynika że skopane jest w głównym bloku i RootKey'e nie mają sub keyów, co jest oczywista bzdurą. i jak tu teraz zrobic żeby działało?

0

Więc tak... wszystko jest ok. Tzn. prawie wszystko, bo tak to nie byłoby problemu. A problem nie tkwi w HasSubKeys, ale w warunkach. Taki warunek jest zły:

  if not KeyNames.Count=0 then

Ponieważ najpierw wartość Count zostanie zanegowana a potem przyrównana z zerem. To tak jakbyś napisał:

  if (not KeyNames.Count)=0 then

Jeśli w warunku porównujesz wartości nie będące typu Boolean (w tym przypadku Integer) to musisz porównania brać w nawiasy, a potem negować całość.
Więc powinno to wyglądać take:

  if not (ValueNames.Count=0) then
  {...}
  if not (KeyNames.Count=0) then

Poza tym pzeoczyłeś <font color="red">-1</span> tutaj:

  for I:=0 to KeyNames.Count -1 do

Teraz jakoś mi to działało :)

0

Dzieki, teraz działa... A pomyśleć, że wiedziałem, iż coś jest skopane... Raczej wyczuwałem nadchodzenie błędu... teszcze tylko kilkanaście kodów do zrobienia i moge spokojnie programować bez błędów.

Dzięki MatroX [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1