Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.08;
Скачать: CL | DM;

Вниз

Не работает RegKey.KeyExists   Найти похожие ветки 

 
dobriy-kot ©   (2008-05-14 12:17) [0]

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

 RegKey.OpenKey("Software\Test",true);
 if RegKey.KeyExists("Software\Test") then
   RegPass:= RegKey.ReadString("Crypto")
 else
 begin
   RegKey:= TRegIniFile.Create("Software\Test");
   RegKey.WriteString("Crypto",CryptoValue);
 end;

Не работает также
if RegKey.KeyExists("Crypto") then
Подскажите, пожалуйста, что можно сделать?


 
Anatoly Podgoretsky ©   (2008-05-14 12:38) [1]

"Software\Test" а это где, а система знает где это?
Читать до посинения, абсолютные и относительные пути.


 
Anatoly Podgoretsky ©   (2008-05-14 12:39) [2]

И почему TRegIniFile - ты что для Windows 3.1 пишешь?


 
dobriy-kot ©   (2008-05-14 12:39) [3]

Да, знает. По умолчанию все пишется в HKEY_CURRENT_USER.


 
dobriy-kot ©   (2008-05-14 12:41) [4]


> И почему TRegIniFile - ты что для Windows 3.1 пишешь?

Переменная типа TRegistry.
var RegKey: TRegistry;


 
{RASkov} ©   (2008-05-14 13:00) [5]

> [0] dobriy-kot ©   (14.05.08 12:17)
> Но условие не проходит, пошаговое выполнение программы показывает,
> что компилятор проскакивает условный оператор.

Потому как после выполнения первой строчки у тебя уже есть этот "Software\Test"
и соответственно следующяя проверка выполняется но возможно не найден "Crypto"....
Так как туда он в данном месте не пишеться.... т.е. вот это:

> begin
>   RegKey:= TRegIniFile.Create("Software\Test");
>   RegKey.WriteString("Crypto",CryptoValue);
> end;

никогда не выполнится....


 
Anatoly Podgoretsky ©   (2008-05-14 13:17) [6]

TRegIniFile никак не похож на TRegistry


 
dobriy-kot ©   (2008-05-14 14:14) [7]


> т.е. вот это:
>
> > begin
> >   RegKey:= TRegIniFile.Create("Software\Test");
> >   RegKey.WriteString("Crypto",CryptoValue);
> > end;
>
> никогда не выполнится....

Как раз это и выполняется прекрасно. А мне надо, чтобы и проверка выполнялась. Это возможно?


 
Сергей М. ©   (2008-05-14 14:21) [8]


> мне надо, чтобы и проверка выполнялась


Проверка должна начинаться раньше, так как это описано в справке к OpenKey:

OpenKey returns true if the key is successfully opened or created

Где она у тебя, эта проверка ?
Какой резон что-то там пыжиться дальше по тексту, если ты сразу же не убедился в том, что ключ успешно создан или открыт в рез-те вызова OpenKey ?


 
Сергей М. ©   (2008-05-14 14:24) [9]


> Не работает также
> if RegKey.KeyExists("Crypto") then


Похоже, что ты путаешь ключ "Crypto" со значением "Crypto"  некоего ключа


 
dobriy-kot ©   (2008-05-14 14:44) [10]

Сергей М.
Смотри. Суть такова: если не существует ключ Crypto, то программа должна запросить создание пароля (потому что он отсутствует). Если существует - то просто прочесть значение ключа Crypto из реестра.
Получается так: если раздел Test отсутствует, то OpenKey создает его, на что показывает параметр true. Если он есть, то просто открывается (Соответственно, наличие раздела нас не интересует - он в любом случае появится).
После этого я хочу выяснить, существует ли ключ Crypto в этом разделе. Его значение не существенно. Если ключ не существует, мы его создаем. Если существует - читаем его значение.
Как написано в хелпе о KeyExists - "Determines if a specified key exists". Насколько я понимаю, именно то, что нужно.


 
Anatoly Podgoretsky ©   (2008-05-14 14:50) [11]

> dobriy-kot  (14.05.2008 14:44:10)  [10]

У ключей нет значений, ты всетаки или путаешь или не понимаешь, что такое ключ, а что такое параметр.


 
Сергей М. ©   (2008-05-14 15:17) [12]


> После этого я хочу выяснить, существует ли ключ Crypto в
> этом разделе


И где в своем коде ты это делаешь ?

Read/WriteString работает не с ключем по имени Crypto, а с неким значением по имени Crypto, возможно существующим в открытом/созданном тобой ключе Software\Test !


 
Сергей М. ©   (2008-05-14 15:25) [13]

Пример:

[HKEY_CURRENT_USER\Software\Skype\Phone\UI\General]
"Language"="ru"

Выделенное жирным - полное имя ключа, включающее абсолютный путь к ключу от корня

Language - имя одного из параметров этого ключа

ru - значение параметра Language

Так вот Read/WriteString будет обращаться именно к значению параметра Language ключа HKEY_CURRENT_USER\Software\Skype\Phone\UI\General, а не к ключу HKEY_CURRENT_USER\Software\Skype\Phone\UI\General\Language.

Ущучиваешь разницу ?



Страницы: 1 вся ветка

Текущий архив: 2008.06.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
2-1210930398
Irina_GR
2008-05-16 13:33
2008.06.08
печать в QReport


2-1210838343
Вася
2008-05-15 11:59
2008.06.08
FireBird и Year()


10-1146837285
Teddy24
2006-05-05 17:54
2008.06.08
Проблема подключенения DCOMConnection


4-1190366220
Stup_ID
2007-09-21 13:17
2008.06.08
ListView (Report) - перевести в режим редактирования


2-1210834088
big
2008-05-15 10:48
2008.06.08
Как в StringGrid e удалить выделенную строку?