Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

Не работает 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.101 c
2-1210990173
Qilgamesh
2008-05-17 06:09
2008.06.08
Как внедрить (вклеить) в файл другие файлы


2-1211109836
DooRs
2008-05-18 15:23
2008.06.08
Переменная классового типа


15-1209368468
xayam
2008-04-28 11:41
2008.06.08
Удаленная установка


2-1210829900
Кирей
2008-05-15 09:38
2008.06.08
Работа с excel, форматирование


11-1189702877
rainstuff
2007-09-13 21:01
2008.06.08
Тормозит ScrollBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский