Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверьте правильность кода! 
:(
    Опции темы
Pakshin A. S.
Дата 5.6.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Вот написал человеку код:
Код

uses Registry;

const
 n = 50;
 
 Keys: array [1..n] of string = (
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network',
 ...
 );

 Names: array [1..n] of string = ( 
 'KeyName1',
 'KeyName2',
 'KeyName3',
 'KeyName4',
 'KeyName5',
 'KeyName6',
 ...
 );

 Root: HKEY = (*раздел*);

 prefix = 'CheckBox'; 


type
 TBaseBox = TCheckBox; 


var
 reg: TRegistry;


procedure LoadRegistry;
var
 i:integer;
 b:TBaseBox;
begin
 reg:=TRegistry.Create;
 reg.RootKey:=Root;
 for i:=1 to n do
  with reg, Form1 do
   begin
    OpenKey(Keys[i], false);
    b:=FindComponent(prefix + IntToStr(i)) as TBaseBox;
    try
     b.Checked:=ReadBool(Names[i]);
    except
     b.Enabled:=false;
    end;
    b.Free;    
    CloseKey
   end;
 reg.Free
end;

procedure SaveRegistry;
var
 i:integer;
 b:TBaseBox;
begin
 reg:=TRegistry.Create;
 reg.RootKey:=Root;
 for i:=1 to n do
  with reg, Form1 do
   begin
    OpenKey(Keys[i], false);
    b:=FindComponent(prefix + IntToStr(i)) as TBaseBox;
    if b.Enabled
     then
      WriteBool(Names[i], b.Checked);
    b.Free;
    CloseKey
   end;
 reg.Free
end;


Он говорит, что этот код не верен... Так ли это? Что исправить?

Суть всей затеи...
Есть 50 Чеков... В них ставятся галочки в соответствии с параметрами реестра... Соответсвие между ними всеми ставится через константы... индексы...
PM   Вверх
Quadr0
Дата 5.6.2005, 14:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 1.7.2011, 14:53
  Вверх
The MASTER
  Дата 5.6.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Old master)
**


Профиль
Группа: Участник
Сообщений: 862
Регистрация: 19.7.2004
Где: Санкт-Петербург

Репутация: 2
Всего: 5



Так, что подскажешь делать?

Кстати, при запуске проги, выдаёт ошибку дебагера:
Код

Project Project1.exe raised exception class ERegistryException with message 
'Faild to get data for NoFind'. Process stopped. Use Step or Run to continue.

PM MAIL WWW ICQ   Вверх
RA
Дата 5.6.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Вобще лень это тестировать, а на первый взгляд видна ошибка

{
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
'\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network',
}

должно быть без символа "\" в начале.

'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network',

PM   Вверх
The MASTER
Дата 5.6.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Old master)
**


Профиль
Группа: Участник
Сообщений: 862
Регистрация: 19.7.2004
Где: Санкт-Петербург

Репутация: 2
Всего: 5



Цитата(Quadr0 @ 5.6.2005, 14:12)
все без имён, вот он ничего и не найдёт.

В каком смысле без имён, ведь смотри, prefix = имени компонента без цифры, а i = это номера компонентов и получается в итоге CheckBox1, CheckBox2 и т.д.

PM MAIL WWW ICQ   Вверх
Dynamic
Дата 5.6.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



Цитата(Pakshin @ 5.6.2005, 14:02)
b:=FindComponent(prefix + IntToStr(i)) as TBaseBox;
    if b.Enabled

Это что за конструкция?? Может все таки
Код

if b <> nil then........
??
и OpenKey надо проверять на возвращаемое значение.


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
<Spawn>
Дата 5.6.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Кстати, я массив ключей реестра по другому записал бы - зачем так память неэффективно расходовать)) Т.е. вот это:

Код

Keys: array [1..n] of string = (
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network',
 ...
 );


Поменял бы на(А может и '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\' стоит отуда выкинуть, если у тебя все ветки реестра находятся там):

Код

Keys: array [1..m] of string = (
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System',
 '\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network',
 ...
 );


И добавил бы промежуточный индексный массив:

Код

KeyIndexes: array[1..n] of integer = (1, 1, 1, 2, 2, 3 ...);



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
The MASTER
Дата 5.6.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Old master)
**


Профиль
Группа: Участник
Сообщений: 862
Регистрация: 19.7.2004
Где: Санкт-Петербург

Репутация: 2
Всего: 5



Ты же сказал, что "\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\" откинешь?
Добавлено @ 15:30
Код

KeyIndexes: array[1..n] of integer = (1, 1, 1, 2, 2, 3 ...);


Рассталкуй пожалуйста неопытному что это значит?
PM MAIL WWW ICQ   Вверх
Pakshin A. S.
Дата 5.6.2005, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Высказываю негодование...
1) 2Quadr0
Зачем в const... да затем... если компонентов будет на 50, а 3... менять в двух местах!!!! НЕХОРОШО!!!
Тип TBaseBox нужен для поиска соответствующих компонетов... Смотри внимательнее и читай поиск компонентов...
Ты наивный человек или незнающий... Почему это не найдет? Почему без имен?!
2) 2Dynamic
Конструкция не ясна? Может на первый взгляд да, но компоненты все всегда находятся... поэтому незачем проверять то, что найден компонент или нет... Здесь фишка в том, что у меня разделов в реестре таковых почти нету (не все есть)... поэтому что читать и изменять,е сли такого нету... поэтмоу при загрузки программы те параметры, которые отсуствуют не берутся в овнимание и соответствующие чеки становятся неактивными... аналогично неактивные чеки не рассматриваются при сохранении инфы...
OpenKey... не очень-то надо... при попытке чтения стоит try... автоматически исключается при этом попытка чтения/записи в несуществующий раздел, т. к. все отлажено через try и Enabled

P. S.
Вот... реальная доработка от Spawn'а... жаль сам не догадался... smile
Добавлено @ 19:24
Так... кто еще попытается найти серьезный баг в коде... СТАВЛЮ ПЛЮС!!!
PM   Вверх
Pakshin A. S.
Дата 5.6.2005, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Хех... объяснить что ли идею <Spawn>'а...

1) У нас все конечные ключи имеют одно и то же начало =>
Код

const
 KeyPrefix = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\';

И уже будем обращаться так:
Код

 OpenKey(KeyPrefix + Keys[i], false);

Соответственно в Keys'ах сократится запись...
2) Действительно массив Keys занимает место... это нехорошо действительно...
Поэтому мы забодим константу, в которой будем хранить вообще все имена ключей, которые будем использовать
Код

const
 KeyNames: array [1..3] of string =(
 'Explorer',
 'System',
 'NetWork');

А в Keys'ах напишем порядковые номера имен ключей из константы KeyNames в соответствующем порядке...
Код

 Keys: array[1..n] of integer = (1, 1, 1, 2, 2, 3 ...);

Итого имеется экономия написания и места...
Вот теперь со всеми доработками будем писать обращение:
Код

 OpenKey(KeyPrefix + KeyNames[Keys[i]], false);

PM   Вверх
p0s0l
Дата 5.6.2005, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



А зачем там b.Free ? smile
По смыслу, после LoadRegistry (и после записи) никаких чекбоксов не останется smile... Или я чего не понял опять ?...



--------------------
С уважением, г-н Посол.
PM   Вверх
Pakshin A. S.
Дата 5.6.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Не наю... действительно вроде ничего... Аааа... вспомнил для чего така делал... Так память освобождается?
Добавлено @ 20:32
Или не так... короче вроде не мешает... smile
PM   Вверх
Albinos_x
Дата 5.6.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
Он говорит, что этот код не верен...


Человек говорит или Не запускается?

Это сообщение отредактировал(а) Albinos_x - 5.6.2005, 20:38


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Pakshin A. S.
Дата 5.6.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



А черт его знает... может он неверно константы записал... или еще что-нить...

Скорее всего трабл в константах...
Добавлено @ 20:41
Т. к. все вроде логически верно построено...
PM   Вверх
Albinos_x
Дата 5.6.2005, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата
Т. к. все вроде логически верно построено...


согласен...

если только...

Код

with reg, Form1 do    
   begin    
    OpenKey(Keys[i], false);    
    b:=FindComponent(prefix + IntToStr(i)) as TBaseBox;    
    try    
     b.Checked:=ReadBool(Names[i]);    
    except    
     b.Enabled:=false;    
    end;    
    b.Free;     
    CloseKey    
   end;


...except...
не нравится, а не прервётся ли выполнение процедуры, если возникнет ошибка... (следовательно процедура выполнится не до конца)?

Добавлено @ 21:05
у себя я обычно пользуюсь KeyExists(key), а для проверки существования параметров в ключе отдельная функция написана


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.