Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try в TRegistry [D6, WinME]


Коля ©   (2002-06-05 02:17:00) 

Как использовать try с TRegistry? Необходимо проверить, существует ли ключ, и если существует, открыть и записать его значение в rrr, а если его нет сделать rrr=0.
пишу вот так, но если ключа нет, дает ошибку:

reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
try
reg.OpenKey("\Control Panel\Desktop\RDe",
rrr := reg.ReadInteger("RRR");
finaly
if Assigned(Reg) then begin
reg.CloseKey;
reg.Free;
end;
end;
подскажите, где ошибка


Игорь Шевченко   (2002-06-05 11:26:00) [1]

Есть такая штука, как Local/Group Policies, в которых можно запретить доступ на запись в реестр даже на определенные ветки в HKCU. В этом случае открытие ключа с KEY_ALL_ACCESS завершится с ошибкой.

Внук © (05.06.02 11:06)
> Опять уел :)))

Это тебе спасибо за напоминание про Access :-))


Внук   (2002-06-05 11:18:00) [2]

>>Anatoly Podgoretsky © (05.06.02 11:09)
Access:=KEY_READ; // ХОТЬ И ЛИШНЕЕ
Почему же лишнее? Согласно Рихтеру, многие приложения, работающие с реесторм под Win9x, не работают под WinNT лишь из-за того, что программист не озаботился нужным доступом и оставил доступ по умолчанию KEY_ALL_ACCESS (правда, сам не проверял).



Anatoly Podgoretsky   (2002-06-05 11:09:00) [3]

Ну если уж заговорили оь правильном коде, то вот последний вариант:

function GetMyCoolSetting : Integer;
const
ERRORINDICATOR = 0;
begin
with TRegistry.Create do
try
Access:=KEY_READ; // ХОТЬ И ЛИШНЕЕ
if OpenKey("\Software\MyCoolApp", False) and
ValueExists("MyCoolSetting")
then
Result := ReadInteger("MyCoolSetting")
else
Result := ERRORINDICATOR;
finally
Free;
end;
end;


Коля © (05.06.02 02:17)
У тебя вопрос и код расходятся, в вопросе про ключ, а в коде про параметр, неясно что же тебе нужно, но видимо второе.


Внук   (2002-06-05 11:06:00) [4]

>>Игорь Шевченко © (05.06.02 11:01)
Опять уел :)))


Игорь Шевченко   (2002-06-05 11:01:00) [5]

Внук © (05.06.02 10:52)

Тогда уж:

with TRegistry.Create (KEY_READ) do

И проблем не будет...
Пустячок, а на строчку меньше :-)))

С уважением,
Игорь Шевченко

P.S. Вот так и рождаются правильные программы :-))


Внук   (2002-06-05 10:52:00) [6]

function GetMyCoolSetting : Integer;
begin
>>Игорь Шевченко © (05.06.02 10:26)
И с этим кодом могут быть проблемы под WinNT по причине того, что по умолчанию назначается KEY_ALL_ACCESS. Так что еще более правильный код

function GetMyCoolSetting : Integer;
begin
Result := -1;
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
Access:=KEY_READ;
if OpenKey("\Software\MyCoolApp",False) then
Result := ReadInteger("MyCoolSetting");
finally
Free();
end;
end;

Но, согласно Song, есть более правильный код, а есть "Наиболее правильный" :)))


Игорь Шевченко   (2002-06-05 10:26:00) [7]

Еще более правильный код: :-)))


function GetMyCoolSetting : Integer;
begin
Result := -1;
with TRegistry.Create do
try
RootKey := HKEY_CURRENT_USER;
if OpenKey("\Software\MyCoolApp", False) and
ValueExists("MyCoolSetting") then
Result := ReadInteger("MyCoolSetting");
finally
Free();
end;
end;


Song   (2002-06-05 09:48:00) [8]

Наиболее правильный и читабельный код:

Function GetNumber:Integer;
Begin
Result:=0;
With TRegistry.Create Do
try
RootKey:=HKEY_CURRENT_USER;
IF OpenKey("\Control Panel\Desktop\RDe",false) then Result:=ReadInteger("RRR");
CloseKey;
finally
Free;
end;
End;

....

rrr:=GetNumber;


Внук   (2002-06-05 09:32:00) [9]

ifreg.OpenKey("\Control Panel\Desktop\RDe", false) then ...
F1, однако...


rrr:=0;
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey("\Control Panel\Desktop\RDe",false) then
begin
rrr := reg.ReadInteger("RRR")
reg.CloseKey;
end;
reg.Free;


Bsl   (2002-06-05 07:48:00) [10]

А те не пользуй TRegistry, а попробуй TRegIniFile - в функциях ReadXXXXX (REadInteger и ReadString) есть знчения по-умолчанию - задай их как-нибудь коряво - т.е. такое значение, которое не может оказаться в реестре, если они вернут тебе его - значит ключа не было. А можно получить список ключей в ветви и посмотреть если ли желаемый.


Наверх

Титульная страница Поиск, карта сайта Написать письмо