Fórum Aviso a cada X dias... #372661

23/07/2009

0

Como faço para um determinado aviso aparecer a cada X dias??
Que tipo de função eu uso para trabalhar com o tempo dessa forma???
(X determinado pelo usuario)


Grato...


Nino Marques

Nino Marques

Responder

Posts

23/07/2009

Facc

no seu banco vc coloca uma coluna com a qtd de dias e a proxima data de execução do aviso. no sistema, no momento que criar o form principal, faz um select e compara se a data é a mesma do computador.


Esse é o modo grosso, creio que alguem tenha outra ideia.


Responder

Gostei + 0

23/07/2009

Nino Marques

Mas me fala uma coisa...
Dessa forma vai ser uma data fixa o aviso???CErto?

Acho q não entendi muito bem oque vc quis dizer!!


Responder

Gostei + 0

23/07/2009

Carlosrm

Nino Marques,

eu testei bem rápido e acho que a idéia geral pode ser útil:

Código:

procedure aviso;
var
datainicial : TDatetime;
intervalo : integer;
begin
datainicial := strtodate(´23/07/2009´);
intervalo := 10;
if ((trunc(date - datainicial) MOD intervalo) = 0) then
showmessage(´Hoje expira o prazo que foi combinado!´)
else
showmessage(´Ainda não...!´);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
aviso;
end;


Observações:
Datainicial é uma variável do tipo data e hora (TDatetime), que vai armazenar uma data base para a função verificar se já se passaram tantos dias (intervalo), quando comparada com a data corrente (date).
Do jeito que está, é possível colocar data atual ou anteriores. Em princípio não faz sentido. Para evitar isso, acrescente um IF tratando essa situação.

Intervalo é a variável que armazena quantos dias devem ocorrer entre um aviso e outro.

MOD é o operador módulo, que retorna o resto da uma divisão de inteiros. Se a diferença entre as duas datas (tratada com TRUNC) for igual ou múltiplo da variável intervalo, a showmessage fará sua aparição, já que o resto da divisão (MOD) será 0 (zero). Note que em outras versões do Delphi o símbolo deste operador pode ser diferente. Eu testei no Delphi 2006 (Explorer).

Trunc é uma função que elimina o ponto (ou vírgula) separador de decimais e também as casa decimais que existirem num tipo com casas decimais. Ah, o tipo TDatetime, na realidade é um tipo double, cuja parte inteira armazena os dias e cuja parte decimal armazena as horas.

Eu coloquei um button para chamar a função, pois assim você pode alterar a data do sistema sem precisar fechar o aplicativo (clique com o botão direito sobre o reloginho do desktop/Ajustar Data/Hora). Acho que mais prático seria fazer diretamente uma chamada à função num evento tipo FormCreate.

Note que você também pode modificar o valor da variável intervalo, de modo que os intervalos sejam progressivamente crescentes/decrescentes.

carlosrm


Responder

Gostei + 0

24/07/2009

Nino Marques

Uuuuhn...muito boa ideia do Carlos parece que eh bem oque eu quero..
Só confesso q não entendi bem essa parte:

´Datainicial é uma variável do tipo data e hora (TDatetime), que vai armazenar uma data base para a função verificar se já se passaram tantos dias (intervalo), quando comparada com a data corrente (date).
Do jeito que está, é possível colocar data atual ou anteriores. Em princípio não faz sentido. Para evitar isso, acrescente um IF tratando essa situação. ´

Pode Explicar melhor?


Responder

Gostei + 0

24/07/2009

Carlosrm

nino marques,

estou um pouco enrolado agora, mas já já envio mais detalhes.
Nesse meio tempo, se ainda não o fez, experimente acrescentar essas linhas de código (num projeto novo ou num já existente) e teste. abraço.
carlosrm


Responder

Gostei + 0

28/07/2009

Carlosrm

Nino Marques,

Primeiro, desculpe a demora...

DataInicial é a primeira data (dd/mm/aaa) em que vai disparar o aviso, isto é, quando (e sempre) que a data do computador coincidir com a DataInicial informada. (É possível, por exemplo, alterar a data do micro e inicializar o programa várias vezes num mesmo dia, várias máquinas...).
A menos que se altere a data do sistema, uma data (dd/mm/aaa) tem duração de 24 hs. Para fazer com que um evento ocorra em intervalos de tempo fixos, uma maneira é estabelecer uma data base (eu a chamei de DataInicial) e disparar o aviso na DataInicial, na DataInicial + (intervalo * 1), DataInicial + (intervalo * 2), DataInicial + (intervalo * 3),... até chegar na maior data que a linguagem utilizada permitir. Mais ou menos assim:
DataInicial := strtodate(´15/11/2009´);
intervalo := 17;

O aviso será disparado quando a data do computador for:
DataInicial + (intervalo * 0)
DataInicial + (intervalo * 1)
DataInicial + (intervalo * 2)
DataInicial + (intervalo * 3)
e assim por diante.... (no Delphi, até o ano 9999, se não me engano...).

Eu usei na função o operador MOD, que informa se a data do computador é uma ´data múltipla´ da DataInicial informada, de acordo com o Intervalo informado.

Quanto à frase ´...acrescente um IF...´, peço para você ignorar e me desculpar. Simplesmente pensei asneira e escrevi besteira.

Se ainda fui pouco claro, ou pior, se não funcionar, por favor, avise. No BDS2006 (D9) funcionou nos poucos testes que fiz.
carlosrm


Responder

Gostei + 0

28/07/2009

Nino Marques

Vou testar certinho aqui em Breve te flo como foiii!!

Até então Brigado msm!!! Tá ajudando demais!!

Abrass


Responder

Gostei + 0

29/07/2009

Nino Marques

Me fla uma coisa....
Eu queria assim..q no dia em que expirasse o tempo determinado, um form aparecesse AUTOMATICAMENTE logo na abertura do programa, com as opçoes do usuario...

Tentei assim:

Application.CreateForm(TFexemplo,Fexemplo);
Fexemplo.Show;


mas não deu certo!!!
Como fazer?


Responder

Gostei + 0

29/07/2009

Carlosrm

Nino Marques,

tente assim:


...
implementation

uses u_fexemplo;

{$R *.dfm}

procedure aviso;
var
  datainicial : TDatetime;
  intervalo : integer;
begin
  datainicial := strtodate(´23/07/2009´);
  intervalo := 10;
  if ((trunc(date - datainicial) MOD intervalo) = 0) then
     try
       Application.CreateForm(TFexemplo,Fexemplo);
       Fexemplo.Showmodal;
     finally
       FreeAndNil(FExemplo);
     end
  else
     showmessage(´Ainda não...!´);   
end;

procedure TForm1.FormCrete(Sender: TObject);
begin
   aviso;
end;
...



Atente para chamar a função Aviso no evento FormCreate do form principal, método showMODAL para exibir o FExemplo e o formulário FExemplo precisa estar definido como Available Forms (Project\Optios...\Forms).

Qulquer coisa, avise.
carlosrm


Responder

Gostei + 0

29/07/2009

Nino Marques

Tá funcionando certinho agora.....
Só uma ultima coisa...hehehe...se for possivel....

No form q eh chamado de X em X dias queria q aparecesse o tamanho em Bytes de uma pasta, tentei alguma funções como:

Sizeof (caminho) mas não deu certo...e creio q não é tão simples....

Sei q num tem haver com o titulo do topico maaaas se possivel me ajude....
Senão Problema Resolvidoo!


Responder

Gostei + 0

29/07/2009

Carlosrm

Nino Marques,

fico contente que foi útil. Quanto ao tamnaho de uma pasta, achei algo aqui na DevMedia mesmo (Artigos, Dicas ClubeDelphi) no endereço:
[url]
https://www.devmedia.com.br/articles/viewcomp.asp?comp=1100&;hl=*foldersize*
[/url]

Se houver alguma dificuldade, eu procurei em ClubeDelphi/Artigos e pesquisei por foldersize (que eu já tinha procurado pelo Google...).
E continue frequentando o Fórum, tem muitos ´fera´ sempre ensinando muita coisa para nós...
abraço,
carlosrm


Responder

Gostei + 0

30/07/2009

Nino Marques

Valeu carlosrm....

Com certeza tem muito p aprender com a galera aqui do forum!!
Abraçoo!


Responder

Gostei + 0

11/08/2009

Nino Marques

Cara to tendo um problema aqui....

o dia de hoje e o tempo para mostrar a mensagem eu quero q seja definida pelo usuario, então criei duas variaveis e coloquei +- assim...
_______________________________________________
procedure TFhd1.FormCreate(Sender: TObject);
var
hoje2 : string;
diash1: string;
begin
hoje2 := dhoje.Text;
diash1:= diasf.Text;
end;


procedure aviso;
var
datainicial : TDatetime;
intervalo : integer;
begin
datainicial := strtodate(hoje2);
intervalo := strtoint(diash1);
if ((trunc(date - datainicial) MOD intervalo) = 0) then
try
Application.CreateForm(TMainform,Mainform);
MainForm.Showmodal;
finally
FreeAndNil(MainForm);
end

end;
____________________________

Mas não está dando certoo...

Qual seria a forma certa de fazer isso?


Responder

Gostei + 0

12/08/2009

Martins

Assim como o Facc, eu tb acho q vc deveria usar uma instrução SQL, com as datas armazenadas em uma tabela, isso seria mais fácil.

Qualquer coisa, poderemos postar um pequeno exemplo.

Boa sorte!


Responder

Gostei + 0

12/08/2009

Nino Marques

Se vcs puderem dar um exemplo seria bom..pq eu num tenho ideia com se usa tabelas no Delphi...inclusive tem outro problema que não estou conseguindo resolver e me aconselharam a usar tabela temporaria...e eu nem sei...

Fico na esperaa!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar