Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2008, 16:58   #1
AIst
Пользователь
 
Аватар для AIst
 
Регистрация: 30.06.2008
Сообщений: 58
По умолчанию Реестр

Здравствуйте уважаемые форумчане! Пишу программу, которая удаляет из реестра ненужные значения. В данном случае это недопустиме URL адреса, которые записывает в реестр Internet Explorer (введенные в адресную строку Web-адреса ). Возникла проблема, программа удаляет все значения независимо от того, допустимые они или нет... ниже основные моменты кода... посмотрите пожалуйста. где я допустил ошибку? Как правильно нужно?

Код:
uses
  Windows, Registry, Messages, SysUtils, ShellApi, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  
...

var
  Form1: TForm1;
  Reg:TRegistry;
  links: array [1..26] of string;
  value_names: TStrings;
  history_patch : string;
  cookies_patch : string;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
//заношу в массив адреса допустимых URL//
links[1]:='https://##############.ru/';
links[2]:='https://##############.ru/';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   counter : integer;
   i : integer;
   s:string;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_CURRENT_USER;
Reg.OpenKey('###здесь путь к ключу###',False);
value_names:=TStringList.Create;
Reg.GetValueNames(value_names); // заношу в StringList параметры ключа реестра
Reg.CloseKey; 
Reg.Free;
for counter:=0 to value_names.Count-1 do
  begin
    s:= value_names[counter];
    for i:=1 to 26 do
         begin
         if (not(s = links[i])) then     // удаляю параметры если их значения не совпадают с заданными в массиве links[]
                                begin
                                Reg:=TRegistry.Create;
                                Reg.RootKey:=HKEY_CURRENT_USER;
                                Reg.OpenKey('###здесь путь к ключу###',False);  
                                Reg.DeleteValue(s);
                                Reg.CloseKey;
                                Reg.Free;
                                end;
         end;
  end;
end;
end.
AIst вне форума Ответить с цитированием
Старый 23.12.2008, 18:19   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
программа удаляет все значения независимо от того, допустимые они или нет
Ничего удивительного.
Вот вы выбрали s:= value_names[counter];
И первое же links оказалось ему не равно (оно равно второму там, или третьему, но до сравнения с ними не доходит), а потому вы его р-р-раз:
[I]if (not(s = links)) then // удаляю параметры если их значения не совпадают с заданными в массиве links[]
и удаляете...
Как исправить? Тоже просто - цикл по [I] для каждого s должен прокручиваться полностью... И если не было ни одного совпадения, только тогда удалять.

Последний раз редактировалось mihali4; 23.12.2008 в 18:22.
mihali4 вне форума Ответить с цитированием
Старый 25.12.2008, 00:11   #3
AIst
Пользователь
 
Аватар для AIst
 
Регистрация: 30.06.2008
Сообщений: 58
По умолчанию

вроде все правильно
Код:
for counter:=0 to value_names.Count-1 do
  begin
    s:= value_names[counter];
это я выбираю одно значение, затем сравниваю с 26 допустимыми
Код:
 for i:=1 to 26 do
         begin
         if (not(s = links[i])) then     // удаляю параметры если их значения не совпадают с заданными в массиве links[]
                                begin
                                Reg:=TRegistry.Create;
                                Reg.RootKey:=HKEY_CURRENT_USER;
                                Reg.OpenKey('###здесь путь к ключу###',False);  
                                Reg.DeleteValue(s);
                                Reg.CloseKey;
                                Reg.Free;
                                end;
         end;
чет я запутался... не вижу...
AIst вне форума Ответить с цитированием
Старый 25.12.2008, 01:01   #4
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

объясняю:
в таких случаях удобно использовать F7
составлю список действий что делает твоя программа:
1) s='helloworld'
2) for i:=1 to 26 do
3) i=0
4) if not (s=links[1]) тоесть :
if not('helloworld'='https://##############.ru/')
- а это правда!
и сразу-же удаляет.

тоесть, при проверке первого-же элементе массива links оно удаляет из реестра.

надо сделать так:
Код:
 flag:=false;
 for i:=1 to 26 do
         begin
           flag:=flag or (not(s = links[i]));
         end;
  if flag then
     //тут удаление
Роман Радер вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реестр EVO-X Win Api 2 14.07.2008 20:19
Реестр Volkogriz Общие вопросы Delphi 5 01.05.2008 21:23
Реестр и C++ Лубышев Помощь студентам 1 12.03.2008 08:28
Реестр Teen4jump Общие вопросы Delphi 2 28.02.2008 10:17
реестр Михаил Юрьевич Общие вопросы Delphi 9 12.02.2008 00:00