Ajuda na comparaçao de datas no registro windows

24/11/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..


O4pr3ndiz

Respostas

25/11/2005

Marcio.theis

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


Responder Citar

25/11/2005

Emerson

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:
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.


Responder Citar

26/11/2005

O4pr3ndiz

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


Responder Citar

26/11/2005

Emerson

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 [i:013ec86ff8]Stop on Delphi Exceptions[/i:013ec86ff8]. Feito isso, o Delphi somente exibirá mensagens para os erros não tratados.


Responder Citar

26/11/2005

O4pr3ndiz

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


Mas valew a força..


Responder Citar

01/12/2005

Emerson

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


Responder Citar

02/12/2005

O4pr3ndiz

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..


Responder Citar

02/12/2005

Emerson

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 [b:703227ba0a]não[/b:703227ba0a];
- depois de mais 30 segundos perguntou de novo. respondi que [b:703227ba0a]não[/b:703227ba0a] novamente;
- mais 30 segundos e perguntou novamente. respondi que [b:703227ba0a]sim[/b:703227ba0a], queria efetuar o bkp;
- nos 30 segundos seguintes a [i:703227ba0a]pergunta não apareceu[/i:703227ba0a]. esperei mais uns 5 minutos e a [i:703227ba0a]pergunta não apareceu[/i:703227ba0a] 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:

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.


Responder Citar

02/12/2005

O4pr3ndiz

obrigado....


Responder Citar