Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > запись в реестр и считывание с него


Автор: curumb 23.5.2010, 20:48
Помогите, пожалуйста разобраться:

Код

procedure TForm1.FormCreate(Sender: TObject);//работа с реестром
var
reg:TRegistry;// объявляю переменную
begin
reg := TRegistry.Create;//создаю объект
if not reg.KeyExists('\Software\RiseV1.0.0.0') then begin//если нет ключа то
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('\Software\RiseV1.0.0.0', true);//создаю и открываю
reg.WriteDate('1DT', Date);//записываю
reg.CloseKey;//закрываю
reg.Free;//освобождаю объект
end else
if reg.KeyExists('\Software\RiseV1.0.0.0') then begin//если ключ есть, то освобождаю объект
reg.Free;
end;
//------
procedure TForm1.Form1Show(Sender: TObject);//работа с реестром
var
reg:TRegistry;
data:TDateTime;
begin
reg := TRegistry.Create;//создаю объект
reg.RootKey := HKEY_LOCAL_MACHINE;
if reg.KeyExists('\Software\RiseV1.0.0.0') then//если ключ существует то
reg.OpenKey('Software\RiseV1.0.0.0', true);//открываю ключ
data:=reg.ReadDate('1DT');//читаю дату
reg.CloseKey;//закрываю ключ
if now-data<2 then begin // если прошло меньше 2 дней с момента записи в реестр, то освобождаю объект
reg.free;
end else
if now-data>2 then begin//если прошло больше 2 дней с момента записи в реестр, то вывожу сообщение
reg.free;
ShowMessage('Действие лицензии истекло');
Form44.Close;// и закрываю все
Form1.Close;
end;

Что не так? записывать записывает, но не сравнивает даты и период, а прордолжает дальше работать.
//------------------------------------
В общем делаю ограничение пользования программой в днях
Вообще, хотелось бы сделать, как в "Касперском", есть ключ на определенное время.Ты его устанавливаешь, пользуешься программой, истекает время, все - сообщение, выход из программы, берешь другой ключ. Мож подскажите, как можно такое реализовать.

Автор: cyberstream 24.5.2010, 09:29
Цитата
Что не так? 
Выяснить поможет отладчик.

Код рабочий. Сабж реализует.
Не под администратором по умолчанию нет разрешений на запись в HKEY_LOCAL_MACHINE.

Автор: curumb 24.5.2010, 22:49
Код рабочий. Сабж реализует. - Что такое сабж???
А вообще я в правильную ветку записываю или нужно,мож в другую???



Автор: Данкинг 24.5.2010, 22:55
Цитата(curumb @  24.5.2010,  23:49 Найти цитируемый пост)
Что такое сабж???

 smile 
Цитата(curumb @  24.5.2010,  23:49 Найти цитируемый пост)
А вообще я в правильную ветку записываю или нужно,мож в другую???

Кому нужно? Откуда же мы тут знаем, в какую ветку тебе нужно записывать? smile А код действительно нормальный.

Добавлено через 1 минуту и 42 секунды
А вообще после date и now разве скобки не нужны? date(), now() ?

Автор: cyberstream 25.5.2010, 08:42
http://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%B1%D0%B6

http://www.winpedia.ru/content/view/877/58/. В твоём случае я бы использовал ту же. 

Скобки не нужны. Это Delphi. smile

Автор: curumb 25.5.2010, 16:21
Спасибо за советы. 
а за статью отдельное!

Автор: curumb 26.5.2010, 18:37
И все равно почему-то не проверяет условие проверки даты - 

if now-data<2 then begin // если прошло меньше 2 дней с момента записи в реестр, то освобождаю объект
reg.free;
end else
if now-data>2 then begin//если прошло больше 2 дней с момента записи в реестр, то вывожу сообщение
reg.free;
ShowMessage('Действие лицензии истекло');
Form44.Close;// и закрываю все
Form1.Close;

просто работает как и работала... Не подскажите, в чем может быть дело?

Автор: Данкинг 26.5.2010, 18:50
curumb, посмотри, какое значение у тебя в переменной data.

Автор: cyberstream 26.5.2010, 19:55
Вместе с датой и время в реестр пишется, считывается и сравнивается с now. С какой точностью будут отмеряться двое суток?  smile 

Не хочешь проверить data отладчиком - воткни ShowMessage
Код

data:=reg.ReadDate('1DT');//читаю дату
reg.CloseKey;//закрываю ключ
ShowMessage('Дата в реестре: '+DateTimeToStr(data)+ '.   Разность: ' + FloatToStr(now-data)); //уберу, когда разберусь
   … но лучше бы smile отладчиком. 

Код

if reg.KeyExists('\Software\RiseV1.0.0.0') then//если ключ существует то
reg.OpenKey('Software\RiseV1.0.0.0', true);//открываю ключ
   Здесь забыл ведущий бэкслэш, в другом месте можешь очепятаться серьёзней. Закинь путь в константу/переменную.

Автор: curumb 27.5.2010, 20:28
ОК, попробую такие варианты...спс smile 

Автор: curumb 28.5.2010, 21:50
С какой точностью будут отмеряться двое суток?   
Точность особого значения не имеет...период приблизительный.

Я в Delphi не особо силен, поэтому не знаю как отладчиком проверить дату, воспользовался представленным кодом - 

ShowMessage('Дата в реестре: '+DateTimeToStr(data)+ '.   Разность: ' + FloatToStr(now-data)); //уберу, когда разберусь

Дату в реестре почему то перезаписывает каждый раз при запуске, не скажите с чем может быть связано?

Автор: cyberstream 29.5.2010, 18:29
По умолчанию RootKey установлено в HKEY_CURRENT_USER.
Код

reg := TRegistry.Create;//создаю объект
reg.RootKey := HKEY_LOCAL_MACHINE;
if not reg.KeyExists('\Software\RiseV1.0.0.0') then begin//если нет ключа то


Автор: curumb 29.5.2010, 23:10
procedure TForm1.FormCreate(Sender: TObject);
var
Reg: TRegistry;
data:TDateTime;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('Software\RiseV1.0.0.0') then begin
Reg.OpenKey('Software\RiseV1.0.0.0', true);
Reg.WriteDate('1Rise', Date);
Reg.CloseKey;
end else
if Reg.KeyExists('Software\RiseV1.0.0.0') then begin
Reg.OpenKey('Software\RiseV1.0.0.0', false);
data:=Reg.ReadDate('1Rise');
if now-data<1 then begin
Reg.CloseKey;
end else
if now-data>1 then begin
Reg.CloseKey;
//здесь пишу: Form1.Close; - выдает ошибку и не закрывает приложение (Acces in violetion at address 0000000 - что-то такое)
end;
end;
finally
Reg.Free;
inherited;
end;
end;
-------------------------------------------------------------------------
Все работает. Единственное, что не получается, закрыть все приложение. Кто-нибудь может подсказать, как это сделать?

Автор: curumb 29.5.2010, 23:34
Разобрался, нашел: Application.Terminate все закрывает.
Всем спасибо кто откликнулся smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)