Data e Hora (problemático!)

12/12/2003

7

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar