Array
(
)

Ajuda na comparaçao de datas no registro windows

O4pr3ndiz
   - 24 nov 2005

Estou desenvolvendo uma aplicação pra ser executada de 30 em 30 dias.
Jah consegui fazer gravar a data atual no envento onshow do form como no codigo abaixo:


regbb:=tregistry.create;
try
regbb.rootkey:=HKEY_CURRENT_USER;
if not regbb.KeyExists(´Software\Microsoft\Config\Key\Windows\backup´) = true then
regbb.CreateKey(´Software\Microsoft\Config\Key\Windows\backup´);

data:= DateToStr(now);
regbb.OpenKey(´Software\Microsoft\Config\Key\Windows\backup´,true);
regbb.WriteTime(data,now);
finally
regbb.Free;

O problema eh usar a chave pra comparar com a data atual e se for igual ou maior que 30 dias, de 30 em 30 dias...

Obrigado..


Marcio.theis
   - 25 nov 2005

Leia a chave que vc tem no registro, compare e depois grava...


Emerson
   - 25 nov 2005

para poder fazer esse controle seu programa precisa ficar rodando em background (ou você precisa agendar isso no windows ou em qualquer outra agenda que aceite o agendamento de execução de programas como se fosse um ´compromisso´).

deveria ser algo assim:
#Código

var
regbb: tregistry;
dataultimobackup: TDate;
begin
regbb := tregistry.create;
try
regbb.rootkey:=HKEY_CURRENT_USER;
regbb.OpenKey(´Software\Microsoft\Config\Key\Windows\backup´,true);

try
dataultimobackup := regbb.ReadDate(´data´);
except
dataultimobackup := sysutils.date - 30;
end;

if (trunc(sysutils.date - dataultimobackup) >= 30) and
(application.MessageBox(´É necessário efetuar o backup. Deseja fazer isso agora?´,
´Backup´,MB_TASKMODAL + MB_YESNO + MB_DEFBUTTON1) = mrYes) then
begin
{rotina de execução do backup}

if BackupEfetuadoComSucesso then
regbb.WriteDate(´data´,sysutils.date);
end;
finally
regbb.Free;
end;
end;


você poderia ainda colocar essa rotina num Timer, para ser executada de hora em hora assim, se o usuário não fizer o backup na abertura do programa, ele será avisado de hora em hora, até que aceite executar o backup.


O4pr3ndiz
   - 26 nov 2005

Agradeço a ajuda mas o codigo aparece o seguinte erro na execução e naum executa

1) erro na linha
dataultimoITA := regita.ReadDate(´data´);

na compilação exibe o erro ERegistryException ´Failed to get data for ´data´

e naum executa o projeto, mudei pra data := DateToStr(now);
e tb naum resolveu.


Eu li sobre o readdate e naum vi nehuma anormalidade de sintaxe, tanto que passo pelo ctrl+F9.

Se puder me ajudar..
Estou precisando disto com urgencia... obrigado


Emerson
   - 26 nov 2005

isso deve trer acontecido porque o valor ´Data´ ainda não havia sido criado. essa informação só aparece para o Delphi e somente na primeira execução. para evitar a exibição de erros tratados, vá em Tools -> Debugger Options -> Language Exceptions e desmarque a caixa Stop on Delphi Exceptions. Feito isso, o Delphi somente exibirá mensagens para os erros não tratados.


O4pr3ndiz
   - 26 nov 2005

.. e funcionou a primeira vez, mas as outras naum...


Mas valew a força..


Emerson
   - 01 dez 2005

com assim ´funcionou a primeira vez, mas as outras naum´?


O4pr3ndiz
   - 02 dez 2005

Coloquei o codigo na integra no timer e funcionou uma vez...
altererei a data do sistema e tudo depois nda.. ele cria a pasta backup no registro vazia....


Eu ainda naum percebi o que aconteceu..


Emerson
   - 02 dez 2005

olha, eu executei aqui e funcionou perfeitamente.

fiz assim:
coloquei um timer com intervalo de 30.000 (30 segundos)

data atual: 01/12/2005 (1o. de dezembro de 2005)
- rodei o programa;
- depois de 30 segundos o programa perguntou se eu queria efetuar o bkp. respondi que não;
- depois de mais 30 segundos perguntou de novo. respondi que não novamente;
- mais 30 segundos e perguntou novamente. respondi que sim, queria efetuar o bkp;
- nos 30 segundos seguintes a pergunta não apareceu. esperei mais uns 5 minutos e a pergunta não apareceu mais.
- alterei a data para 31/12/2005 - 31 de dezembro de 2005 - portanto, TRINTA DIAS PRA FRENTE, e a pergunta começou a aparecer novamente.

ou seja, tudo funcionou como devido...


OBS.: o registro do windows só será alterado se você optar por efetuar o bkp e esse for efetuado com sucesso (conforme aquele código passado)

p.s.: eu só gostaria de acrescentar duas linha àquele código:

#Código

var 
regbb: tregistry;
dataultimobackup: TDate;
begin
TIMER1.ENABLED := FALSE; // nova linha

regbb := tregistry.create;
try
regbb.rootkey:=HKEY_CURRENT_USER;
regbb.OpenKey(´Software\Microsoft\Config\Key\Windows\backup´,true);

try
dataultimobackup := regbb.ReadDate(´data´);
except
dataultimobackup := sysutils.date - 30;
end;

if (trunc(sysutils.date - dataultimobackup) >= 30) and
(application.MessageBox(´É necessário efetuar o backup. Deseja fazer isso agora?´,
´Backup´,MB_TASKMODAL + MB_YESNO + MB_DEFBUTTON1) = mrYes) then
begin
{rotina de execução do backup}

if BackupEfetuadoComSucesso then
regbb.WriteDate(´data´,sysutils.date);
end;
finally
regbb.Free;
end;

TIMER1.ENABLED := TRUE; // nova linha
end;


assim o timer será executado e, se for o necessário, irá esperar a resposta do usuário para reiniciar a contagem do tempo.


O4pr3ndiz
   - 02 dez 2005

obrigado....