Data e Hora (problemático!)

12/12/2003

5

Olá pessoal!

Com relação a data e hora, preciso saber duas coisas:

1- Como descobrir a data e a hora local, porém sem ser acessando as configurações do Windows?
Seria a mesma coisa que o Linux faz automaticamente quando conectado à internet por uma Lan de IP fixo (24h/dia), tomando como referência um relógio atômico de um lugar qualquer do mundo.

2- Como gravar em registros do Windows a data e a hora para que eu possa tomá-las como referência em consultas futuras?

Grato.
wbb


Responder

Posts

12/12/2003

Deus

Bem, o primeiro é bem simples. :) A paleta de componentes [i:67d1b01e5d]IndyClients[/i:67d1b01e5d] já tem um componente que faz isso, que é o [i:67d1b01e5d]IdSNTP[/i:67d1b01e5d], onde SNTP significa [i:67d1b01e5d]Simple Network Time Protocol[/i:67d1b01e5d]. Então, para receber o horário correto, é só você usar o seguinte código em um [i:67d1b01e5d]OnClick[/i:67d1b01e5d] de um botão ou em qualquer outro lugar:

IdSNTP1.Active := True;
repeat
  edit1.Text := FormatDateTime(´dd/mm/yyyy hh:mm:ss´, IdSNTP1.DateTime);
Until (IdSNTP1.DateTime <> 0);


Configure o servidor do IdSNTP1 como [i:67d1b01e5d]time-a.nist.gov[/i:67d1b01e5d], que é um dos servidores de Data/Hora do NIST. Se preferir, clique [url=http://www.boulder.nist.gov/timefreq/service/time-servers.html]aqui[/url] para obter uma lista completa dos servidores. :)

Continuo a mensagem a seguir... abraços, dEUS. ;)


Responder

12/12/2003

Deus

Bem, continuando: eu criei este código para você poder escrever / ler uma Data/Hora qualquer, usando o registro do windows. Veja esse procedimento e essa função:

  function  LerRegistro: TDateTime;
  var
    rgRegistro: TRegistry;
  begin
    try
      rgRegistro := TRegistry.Create;
      with rgRegistro do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        if OpenKey(´SOFTWARE\DataHora´, False) then
          Result := ReadDateTime(´HoraData´)
        else
          Result := 0;
        CloseKey;
        Free;
      end;
    except on E: Exception do
      ShowMessage(´Ocorreu o seguinte erro: ´ + E.Message);
    end;
  end;

  procedure CriarRegistro(DataHora: TDateTime);
  var
    rgRegistro: TRegistry;
  begin
    try
      rgRegistro := TRegistry.Create;
      with rgRegistro do
      begin
        RootKey := HKEY_LOCAL_MACHINE;
        OpenKey(´SOFTWARE\DataHora´, True);
        WriteDateTime(´HoraData´, DataHora);
        CloseKey;
        Free;
      end;
    except on E: Exception do
      ShowMessage(´Ocorreu o seguinte erro: ´ + E.Message);
    end;
  end;


Bem, o procedimento [i:9eddae02c3]CriarRegistro[/i:9eddae02c3] é um procedimento que vai, com o parâmetro [i:9eddae02c3]TDateTime[/i:9eddae02c3] que você passar, criar uma entrada no registro do Windows com esses dados. Já [i:9eddae02c3]LerRegistro[/i:9eddae02c3] é uma função que retorna o valor que foi gravado com [i:9eddae02c3]CriarRegistro[/i:9eddae02c3], que você pode guardar numa variável do tipo [i:9eddae02c3]TDateTime[/i:9eddae02c3]. Você usaria da seguinte forma:

CriarRegistro(Now);
varHoraData := LerRegistro;


O que eu fiz foi criar um registro com a hora atual ([i:9eddae02c3]Now[/i:9eddae02c3]) e resgatar esse valor com a função [i:9eddae02c3]LerRegistro[/i:9eddae02c3].

Espero que seja isso o que você queria!! Abraços, dEUS.


Responder

13/12/2003

Wbb

Valeu mesmo hein!

Era isso mesmo que eu precisava.
O lance de ajuste de horas já está OK e funcionando, conforme sua indicação. Já com relação aos registros eu ainda não testei, mas acredito que não haverá problemas.

Obrigado pela ajuda.
wbb


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira