Relógio interno
Olá pessoal, preciso de uma ajuda para montar um relógio no sistema que seja sincronizado em sua criação com a data e hora vinda de um servidor.Ou seja eu dou uma data e uma inicial a ele, e a partir de então ele vai incrementando o tempo.
Joaohenriquemf
Curtidas 0
Respostas
Javapaulomg
02/06/2008
Olá pessoal, preciso de uma ajuda para montar um relógio no sistema que seja sincronizado em sua criação com a data e hora vinda de um servidor.Ou seja eu dou uma data e uma inicial a ele, e a partir de então ele vai incrementando o tempo.
Não sei se seria um boa pratica, mais pode obter a data e hora do servidor atraves de uma consulta SQL, e apartir dai ir incrementando uma variável com está data e hora com um componente TTimer, espero ter ajudado.
GOSTEI 0
Joaohenriquemf
02/06/2008
mais no caso como seria alimentada essa variável?Por um componente chamado timer?alguma coisa assim?
GOSTEI 0
Vitor Alcantara
02/06/2008
Fasso assim em minhas aplicações
PS: Conexao é a classe que criei pra conexão com banco de dados.
PS2 : Nescessário declarar unit DateUtils
procedure tConsultas.SincronizaHora; var Data:TSystemTime; ano,dia,mes,hora,segundo,minuto,ml:word; Dt:tDateTime; begin try Conexao := tConexao.create(nil,´sCom´); GetLocalTime(Data); with Conexao.Query do begin Close; SQL.Clear; SQL.Add(´SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE´); Open; Dt := Fields[0].AsDateTime; Close; end; DecodeDate(dt,ano,mes,dia); DecodeTime(dt,hora,minuto,segundo,ml); with Data do begin wYear := ano; wMonth:= mes; wDay := dia; wHour:= hora; wMinute := minuto; wSecond := segundo; end; SetLocalTime(Data); finally Conexao.Destroy; end; end;
PS: Conexao é a classe que criei pra conexão com banco de dados.
PS2 : Nescessário declarar unit DateUtils
GOSTEI 0
Vitor Alcantara
02/06/2008
Não tinha prestado atenção direito no que você queria.
Do modo que coloquei acima você irá alterar a data e hora do computador cliente com a data e hora do servidor, mais a idéia é a mesma que o colega falou acima, pegar a data e hora do servidor através de uma consulta SQL por exemplo, alimentar uma váriavel e ir incrementando a mesma com um tTimer por exemplo
Você pode declarar uma váriavel do tipo datetime, dai no evento onTimer de um tTimer você pode ir acrescentando um segundo a cada disparo:
Ex:
Para pegar a data e hora num servidor Firebird por exemplo:
O Evento do Timer:
Ps: Para utilizar a função IncSecond é nescessário declarar a unit DateUtils na uses do teu form.
Do modo que coloquei acima você irá alterar a data e hora do computador cliente com a data e hora do servidor, mais a idéia é a mesma que o colega falou acima, pegar a data e hora do servidor através de uma consulta SQL por exemplo, alimentar uma váriavel e ir incrementando a mesma com um tTimer por exemplo
mais no caso como seria alimentada essa variável?Por um componente chamado timer?alguma coisa assim?
Você pode declarar uma váriavel do tipo datetime, dai no evento onTimer de um tTimer você pode ir acrescentando um segundo a cada disparo:
Ex:
Para pegar a data e hora num servidor Firebird por exemplo:
with Query do begin Close; SQL.Clear; SQL.Add(´SELECT CURRENT_TIMESTAMP FROM RDB$DATABASE´); Open; VarDataHora := Fields[0].AsDateTime; Close; end;
O Evento do Timer:
VarDataHora := IncSecond(VarDataHora,1); Label1.Caption := DateTimeToStr(VarDataHora);
Ps: Para utilizar a função IncSecond é nescessário declarar a unit DateUtils na uses do teu form.
GOSTEI 0
álison Bissoli
02/06/2008
Meu caro amigo,
não podemos desperdiçar memória... e sabemos que se consultarmos
e incrementar pode sair de sincronia se alguem alterar a data no servidor
do banco, se você procura mesmo integridade faça o seguinte:
- Ative no cliente o serviço de ´Horário do Windows´, isso fará com que
sempre que o windows carregar sincronize a hora do computador cliente
com o servidor DNS.
- Esqueça de rotinas de incremento, a cada vez que for gravar algo que
necessita de integridade de horário é só fazer o select da hora que nosso
amigo postou acima e verificar com a hora do computador colocando uma
margenzinha de tolerância de uns 5 minutos (ou quanto achar melhor) entre o retorno do select e a hora da máquina local. Caso a hora local saia
da faixa informe ao usuário a hora local e hora do servidor para que o
mesmo corrija.
Existem maneiras e maneiras de trabalhar, nosso amigo acima não está
errado, mas prefiro trabalhar assim...
um abraço e espero ter ajudado.
não podemos desperdiçar memória... e sabemos que se consultarmos
e incrementar pode sair de sincronia se alguem alterar a data no servidor
do banco, se você procura mesmo integridade faça o seguinte:
- Ative no cliente o serviço de ´Horário do Windows´, isso fará com que
sempre que o windows carregar sincronize a hora do computador cliente
com o servidor DNS.
- Esqueça de rotinas de incremento, a cada vez que for gravar algo que
necessita de integridade de horário é só fazer o select da hora que nosso
amigo postou acima e verificar com a hora do computador colocando uma
margenzinha de tolerância de uns 5 minutos (ou quanto achar melhor) entre o retorno do select e a hora da máquina local. Caso a hora local saia
da faixa informe ao usuário a hora local e hora do servidor para que o
mesmo corrija.
Existem maneiras e maneiras de trabalhar, nosso amigo acima não está
errado, mas prefiro trabalhar assim...
um abraço e espero ter ajudado.
GOSTEI 0