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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2010, 12:44   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Восклицание Реестр, нужно оптимизировать код

Всем доброго времени суток!

Вот начал работу с реестром системы, напсал обработчик checkBox, действия которого включают или отключаю Windows Error Reporting в системах XP, Seven, 2008 в зависимости от состояния.

Код:
procedure TSettingsForm.DisableWinErrorRepotingChkClick(Sender: TObject);
var
  Reg: TRegistry; //Реестр
  RegKey: string;
begin
  try
    Reg := TRegistry.Create;
    if not IsWindows7 then //Windows XP
    begin
      Reg.RootKey := HKEY_LOCAL_MACHINE; //Идём сюда
      RegKey := 'SOFTWARE\Microsoft\PCHealth\ErrorReporting'; //по этому адресу
      if Reg.OpenKey(RegKey, FALSE) then //Открываем ключ и нельзя его создать
      begin
        if Reg.ValueExists('DoReport') then //Если такой параметр есть то
        begin
          if DisableWinErrorRepotingChk.Checked then //Если чекнут то
          begin
            Reg.WriteInteger('DoReport', 0); //Отключаем
            DisableWinErrorRepotingChk.Caption := 'Включить Windows Error Reporting (Отключено)';
          end
          else //Иначе
          begin
            Reg.WriteInteger('DoReport', 1); //Включаем
            DisableWinErrorRepotingChk.Caption := 'Выключить Windows Error Reporting (Включено)';
          end;
        end;
      end;
      Reg.CloseKey;
    end
    else //Windows 7, Server 2008
    begin

      Reg.RootKey := HKEY_LOCAL_MACHINE;
      RegKey := 'SYSTEM\CurrentControlSet\Control\Windows';
      if Reg.OpenKey(RegKey, False) then
      begin
        if Reg.ValueExists('ErrorMode') then
        begin
          if DisableWinErrorRepotingChk.Checked then //Если чекнут то
          begin
            Reg.WriteInteger('ErrorMode', 2); //Отключаем
            DisableWinErrorRepotingChk.Caption := 'Включить Windows Error Reporting (Отключено)';
          end
          else //Иначе
          begin
            Reg.WriteInteger('ErrorMode', 0); //Включаем
            DisableWinErrorRepotingChk.Caption := 'Выключить Windows Error Reporting (Включено)';
          end;
        end;
        Reg.CloseKey;
      end;

      Reg.RootKey := HKEY_LOCAL_MACHINE;
      RegKey := 'SYSTEM\ControlSet001\Control\Windows';

      if Reg.OpenKey(RegKey, False) then
      begin
        if Reg.ValueExists('ErrorMode') then
        begin
          if DisableWinErrorRepotingChk.Checked then //Если чекнут то
          begin
            Reg.WriteInteger('ErrorMode', 2); //Отключаем
            DisableWinErrorRepotingChk.Caption := 'Включить Windows Error Reporting (Отключено)';
          end
          else //Иначе
          begin
            Reg.WriteInteger('ErrorMode', 0); //Включаем
            DisableWinErrorRepotingChk.Caption := 'Выключить Windows Error Reporting (Включено)';
          end;
        end;
        Reg.CloseKey;
      end;

      Reg.RootKey := HKEY_CURRENT_USER;
      RegKey := 'Software\Microsoft\Windows\Windows Error Reporting';

      if Reg.OpenKey(RegKey, False) then
      begin
        if Reg.ValueExists('DontShowUI') then
        begin
          if DisableWinErrorRepotingChk.Checked then //Если чекнут то
          begin
            Reg.WriteInteger('DontShowUI', 1); //Отключаем
            DisableWinErrorRepotingChk.Caption := 'Включить Windows Error Reporting (Отключено)';
          end
          else //Иначе
          begin
            Reg.WriteInteger('DontShowUI', 0); //Включаем
            DisableWinErrorRepotingChk.Caption := 'Выключить Windows Error Reporting (Включено)';
          end;
        end;
        Reg.CloseKey;
      end;
    end;
  finally
    Reg.Free; //Освобождаем память
  end;
end;
У меня жуткое чуство того что можно проще и без таких ГАБАРИТОВ.
Но я в упор не вижу как можно уменьшить размер процедуры с созданением её действия.

Подскажите что использовать.

Всего-то есть 4 ключа реестра.
Три для NT систем Seven, Server 2008 и один для XP.

В зависимости от сотояния CheckBox'а менять значение параметров в реестре.

Можно использовать
Код:
case checkbox.checked of
true: begin {something} end;
false: begin {something} end;
но размер процедуры отнюдь не уменьшится, ведь можно ещё проще!(Или только кажется?) Как? В упор не вижу!

Последний раз редактировалось Человек_Борща; 06.11.2010 в 12:59.
Человек_Борща вне форума Ответить с цитированием
Старый 06.11.2010, 12:57   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Всего-то есть 4 ключа реестра.
Три для NT систем Seven, Server 2008 и один для XP.

Можно использовать
Код:
case checkbox.checked of
true: begin {something} end;
false: begin {something} end;
но размер процедуры отнюДь не уменьшится, ведь можно ещё проще!(Или только кажется?) Как? В упор не вижу!
Шаг первый - if Reg.ValueExists('DoReport') then - значения типа 'DoReport' вывести в переменную, например, regv...
И так далее.
А мысль ваша правильная, но в CASE нужно только задавать переменные, а цикл обработки - общий для всех, только для Seven, Server 2008 повторяется 3 раза...
mihali4 вне форума Ответить с цитированием
Старый 06.11.2010, 13:00   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
if not IsWindows7 then //Windows XP
Капитан Очевидность в панике!
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.11.2010, 13:40   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Мы все иногда пишем ляпы...
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как оптимизировать код C++ slim>>> Помощь студентам 10 25.01.2011 00:05
нужно оптимизировать код adwaer PHP 11 21.03.2010 02:20
помогите оптимизировать код. kievlyanin Microsoft Office Excel 3 22.05.2009 18:20
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06
Оптимизировать код NeiL Помощь студентам 2 21.02.2008 08:57