Ir para conteúdo
Fórum Script Brasil
  • 0

X Tempo Fazer Y Ação


Jhonatas araujo

Pergunta

Galera eu estou Desenvolvendo uma Application que faz uma Determinada Ação {y} com um Determinado tempo {x} ...

Tipow eu pego a Data e hora que o Software foi Criado na Máquina/

E para exemplo vamos usar:

Depois de 30 dias e em 12:00 fazer uma Determinada Ação//

Eu sei fazer!!! a função que se for tal Dia e Tal hora fazer tal Ação!!!

Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!

E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...

Como Criar Isso/ ?/ alguém Sabe //

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0
Tipow eu pego a Data e hora que o Software foi Criado na Máquina/

E para exemplo vamos usar:

Depois de 30 dias e em 12:00 fazer uma Determinada Ação//

Eu sei fazer!!! a função que se for tal Dia e Tal hora fazer tal Ação!!!

Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!

E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...

OBS: Incentivo aos programadores a utilizar este tipo codigo, pois tive um problema com um cliente onde o programa já estava rodando a algum tempo ( mais de 30 dias ) e o cliente não se prontificou a fazer o pagamento e acabou não fazendo. No entanto como tinha no programa este codigo, no tempo determinado o mesmo se auto-deletou, e não precisei criar caso. Quando o programa sumiu o cliente voltou a me procurar, mas dai já não quis mais negociar com ele. ( Se o pagamento tivesse ocorrido, ai eu enviaria outro sem esta restrição )

function DataDeCriacao(Arq: string): TDate;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
  h := Windows.FindFirstFile(PChar(Arq), ffd);
  try
    if (INVALID_HANDLE_VALUE <> h) then begin
      FileTimeToLocalFileTime(ffd.ftCreationTime, lft);
      FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
    end;
  finally
    Windows.FindClose(h);
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
   Data: TDate;
   var  Lista : TStringList;
begin
   Data := DataDeCriacao(Application.ExeName);

   //Este programa se auto-deleta e o delexec.bat em 30 dias apos a data da sua criação

   if datetostr(data+30) <= datetostr(now) then
      begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Pode cre... bem Da hora!!! Parabens/ mano//

Ow Jhonas Mais eu já tinha testado essa parte:

begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;

Muitas vezes e Nunca ele se Auto Deleta!!!

Razão:

Por que o mesmo {o 'delexec.bat'} foi Chamado pelo Aplicativo e o Aplicativo está na memória do Sistema ainda...//

Fazendo dar erro e não Deleta-lo!!!

Mais Ai deu Certo?/?

Se deu/ oque eu estou fazendo de Errado??/

Vlw...

Abraço...

Editado por Jhonatas araujo
Link para o comentário
Compartilhar em outros sites

  • 0
Mais Ai deu Certo?/?

Se deu/ oque eu estou fazendo de Errado??/

Aqui comigo sempre da certo ... se voce executar pelo delphi ele some com o executavel e se tentar rodar de novo vai receber a mensagem:

Could not find program, 'C:\Arquivos de Programas\Borland\Delphi5\Bin\Project1.exe'

ou seja, ele não encontra mais o programa ... para fazer funcionar novamente voce tem que compilar novamente o programa

faça o teste do codigo, colocando ele num botao e veja o que acontece.

function DataDeCriacao(Arq: string): TDate;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
  h := Windows.FindFirstFile(PChar(Arq), ffd);
  try
    if (INVALID_HANDLE_VALUE <> h) then begin
      FileTimeToLocalFileTime(ffd.ftCreationTime, lft);
      FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
    end;
  finally
    Windows.FindClose(h);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Data: TDate;
   var  Lista : TStringList;
begin
   Data := DataDeCriacao(Application.ExeName);
   //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação
   if datetostr(data) = datetostr(now) then
      begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Olha só o Código: e Dá Erro//

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var  Lista : TStringList;
begin
Lista := TStringList.Create;
try
Lista.Add('Del "'+ParamStr(0)+'"');
Lista.Add('Del Delexec.bat');
Lista.SaveToFile('Delexec.bat');
finally
Lista.Free;
end;
WinExec('delexec.bat',SW_HIDE);
close;
end;
end.
E também :
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
WinExec('Delexec.bat', SW_HIDE);
end;

procedure TForm1.FormCreate(Sender: TObject);
  var  Lista : TStringList;
begin
Lista := TStringList.Create;
try
Lista.Add('Del "'+ParamStr(0)+'"');
Lista.Add('Del Delexec.bat');
Lista.SaveToFile('Delexec.bat');
finally
Lista.Free;
end;
end;

end.

Ele só Deleta o Proprio "Delexec.bat" Mais o Executavel... Continua ...

Saberia Me Responder qual é meu Erro!!! Estou Usando o Delphi 7 e o 2007 !!!

Vlw

Abraço .

Editado por Jhonatas araujo
Link para o comentário
Compartilhar em outros sites

  • 0

Caro Jhonatas ...voce deve prestar um pouquinho mais de atenção, se voce olhar no post que te passei, voce copiou apenas uma parte do codigo ( onde esta a condição da data ?) , e a outra ( function ) ????

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function DataDeCriacao(Arq: string): TDate;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
  h := Windows.FindFirstFile(PChar(Arq), ffd);
  try
    if (INVALID_HANDLE_VALUE <> h) then begin
      FileTimeToLocalFileTime(ffd.ftCreationTime, lft);
      FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
    end;
  finally
    Windows.FindClose(h);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Data: TDate;
   var  Lista : TStringList;
begin
   Data := DataDeCriacao(Application.ExeName);
   //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação
   if datetostr(data) <= datetostr(now) then  
      begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;

end.

OBS: Se voce copiar errado não vai funcionar

neste comando :

if datetostr(data) = datetostr(now) then

basta acrescentar o numero de dias que voce quer que seu programa funcione

exemplo :

if datetostr(data+ 60) = datetostr(now) then // se auto-deleta apos 60 dias

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eu seiii!!! Eu não Seria tão Burro Assim!!!

Foi Apenas o Exemplo que te Mostrei!!!

Por que a Parte da Data Ela Funciona!!! {a que você Menssionou}; //eu Testei em Outros Feitos e Ele Funciona//

Mais oque não Funciona é apenas a Função de Deletar!!! // Aqui não está Funcionando //

E Eu não Apenas Copio o Código, eu Estudo muito antes, e Monto Minha Aplicação!!!

Desculpa, mais você me entendeu Errado!!!

A Parte da Data Funciona Perfeitamente!!! Mais é só a parte De Deletar!!!

Por Isso que Menssionei o Post #4 !!!

e no poster #1

E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...

Desculpa mesmo ai Qualquer Coisa!!!

è que já Testei de Todo jeito e Não Funciona!!!

vlw Abraço ...

Editado por Jhonatas araujo
Link para o comentário
Compartilhar em outros sites

  • 0
Desculpa, mais você me entendeu Errado!!!

A Parte da Data Funciona Perfeitamente!!! Mais é só a parte De Deletar!!!

ok ... não precisa pedir desculpas ... mas comigo funciona

faça este teste, coloque o codigo no OnActive do form, do jeito que esta aqui. não vai ter erro.

procedure TForm1.FormActivate(Sender: TObject);
var
   Data: TDate;
   var  Lista : TStringList;
begin
   Data := DataDeCriacao(Application.ExeName);

   if datetostr(data) <= datetostr(now) then
      begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;

abraço;

Link para o comentário
Compartilhar em outros sites

  • 0

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function DataDeCriacao(Arq: string): TDate;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
  h := Windows.FindFirstFile(PChar(Arq), ffd);
  try
    if (INVALID_HANDLE_VALUE <> h) then begin
      FileTimeToLocalFileTime(ffd.ftCreationTime, lft);
      FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
    end;
  finally
    Windows.FindClose(h);
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
var
   Data: TDate;
   var  Lista : TStringList;
begin
   Data := DataDeCriacao(Application.ExeName);

   if datetostr(data) <= datetostr(now) then
      begin
         Lista := TStringList.Create;
         try
            Lista.Add('del "'+ParamStr(0)+'"');
            Lista.Add('del delexec.bat');
            Lista.SaveToFile('delexec.bat');
         finally
            Lista.Free;
         end;
         WinExec('delexec.bat',SW_HIDE);
         close;
      end;
end;
end.

Cara eu Fiz Fiz e Refiz!!!

E Não Funciona!!!

Deve ser Algum problema aqui!!! -_-

Mais eu já Testei no Delphi 7 e o 2007

Oque será que pode ser//

vlw Abraço ...

Editado por Jhonatas araujo
Link para o comentário
Compartilhar em outros sites

  • 0
Mais eu queria que Começasse a Contagem a partir do momento que foi Criado o Aplicativo na Máquina!!!

E nesse Exemplo depois do Tempo, o Arquivo se Auto Deletária!!! {Só no Exemplo} ...

Isto não funciona tão bem quanto parece. Se eu tiver a instalação de um programa e após um tempo ele se auto-deletar, eu simplesmente o instalaria novamente e alteraria sua data antes de usá-lo (tem vários programinhas na net para esta finalidade)

Eu não faço uso deste tipo de recurso, mas talvez o componente TmxProtector que mencionei neste post possa vir a servir como meio de proteção do software - dê uma olhada nos recursos que ele oferece.

Mais eu já tinha testado essa parte:

...

Muitas vezes e Nunca ele se Auto Deleta!!!

Razão:

Por que o mesmo {o 'delexec.bat'} foi Chamado pelo Aplicativo e o Aplicativo está na memória do Sistema ainda...//

Fazendo dar erro e não Deleta-lo!!!

No Windows (o que não ocorre no Linux), quando o programa está em uso, não é possível excluí-lo! (ao menos, foi o que apurei há algum tempo, justamente tentando retirar esta dúvida)

neste comando :

if datetostr(data) = datetostr(now) then

basta acrescentar o numero de dias que voce quer que seu programa funcione

exemplo :

if datetostr(data+ 60) = datetostr(now) then // se auto-deleta apos 60 dias

para funcionar corretamente, este teste deveria manter a verificação fazendo uso do "<=" (como postado inicialmente) e, ainda, não poderia avaliar a data no formato string. Observe o que ocorreria se tivéssemos as datas:

Criação do arquivo: 23/2/2008

Data Atual: 13/3/2008

no teste do primeiro caracter das datas convertidas para string, "1" é menor que "2", logo já se passaram 19 dias e a data atual seria erroneamente considerada menor que a de criação.

Devemos ter em mente que, em ordenação de datas no formato string, devemos formatá-la como yyyy/mm/dd para uma correta comparação.

Também acrescentaria que seria mais interessante utilizar apenas a data, deixando de fora a parte correspondente à horas.

Então, temos duas opções:

if FormatDateTime('yyyy/mm/dd', data+ 60) <= FormatDateTime('yyyy/mm/dd', Date) then

ou

if Trunc(data+ 60) <= Trunc(Date) then

... mas comigo funciona

faça este teste, coloque o codigo no OnActive do form, do jeito que esta aqui. não vai ter erro.

Jhonas, eu lhe diria que é uma questão de tempo (ou melhor processamento). Aparentemente, o programa a ser executado via WinExec demora um pouquinho para ser "startado", dando a chance de o nosso programa encerrar e então ser excluído.

Exagerando um pouquinho, faça você o seguinte teste: coloque um Sleep(1000) logo após o WinExec e antes do Close.

Talvez uma alternativa seja executar este procedimento o mais próximo possível do encerramento do programa (ou antes mesmo de criar qualquer tela).

Jhonatas araujo, experimente mover o código do Jhonas para o fonte (source) do projeto. Possivelmente você deverá acrescentar a cláusula uses as units: Windows, SysUtils e Classes.

Ficaria algo assim:

program Project1;
uses
  Forms,
  Windows,
  SysUtils,
  Classes,
  unit1 in 'unit1.pas' {Form1};

{$R *.RES}

var
  Data: TDateTime;
  Lista : TStringList;

function DataDeCriacao(Arq: string): TDateTime;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
...
end;

begin
  Data := DataDeCriacao(Application.ExeName);
  if Trunc(data+60) <= Trunc(Date) then
  begin
     Lista := TStringList.Create;
     try
        Lista.Add('del "'+ParamStr(0)+'"');
        Lista.Add('del delexec.bat');
        Lista.SaveToFile('delexec.bat');
     finally
        Lista.Free;
     end;
     WinExec('delexec.bat',SW_HIDE);
   //  Sleep(10); // usado o para teste
  end else
  begin
   // continua com programa normalmente
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.

Na máquina em que testei, 10 milisegundos foi o tempo máximo que pude colocar para que a aplicação pudesse ser excluída. Logo, acredito que possa funcionar para você - experimente.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Aqui ele Não Deleta de Jeito Nenhum!!! Mais Deixa Ta Valendo!!!

Deve ser Algum Erro Aqui/ Sei la!!! Tentarei até Encontrar oque é!!!

Apesar do que eu sugeri como possibilidade de utilização do que o colega Jhonas lhe apresentou, na verdade não deveria deletar mesmo (como mencionei, no Windows não vai funcionar) - você precisará de algum outro artifício para isto.

Talvez, adicionar a um arquivo de recursos um pequeno programa que delete o seu programa:

- Voce testa a data, como já faz;

- se venceu, extrai o pequeno programa para uma pasta temporária;

- o coloca em execução e encerra o seu programa;

este programa temporário, verifica que seu programa não está mais rodando e o exclui; Ele poderá ficar lá mesmo na pasta temporária, já que não terá qualquer utilidade.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Aqui ele Não Deleta de Jeito Nenhum!!! Mais Deixa Ta Valendo!!!

Jhonatas.. fiz uma modificação no codigo ... tenta ai

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function DataDeCriacao(Arq: string): TDate;
var
  ffd: TWin32FindData;
  dft: DWORD;
  lft: TFileTime;
  h: THandle;
begin
  h := Windows.FindFirstFile(PChar(Arq), ffd);
  try
    if (INVALID_HANDLE_VALUE <> h) then begin
      FileTimeToLocalFileTime(ffd.ftCreationTime, lft);
      FileTimeToDosDateTime(lft, LongRec(dft).Hi, LongRec(dft).Lo);
      Result := FileDateToDateTime(dft);
    end;
  finally
    Windows.FindClose(h);
  end;
end;


procedure TForm1.FormActivate(Sender: TObject);
var F: TextFile; Bat: string;
      Data : TDate;
begin
   Data := DataDeCriacao(Application.ExeName);
   //Este programa se auto-deleta e o proprio delexec.bat em 30 dias apos a data da sua criação
   if datetostr(data+30) <= datetostr(now) then
     begin

        Bat := ChangeFileExt(Application.ExeName,'.bat');
        AssignFile(F, Bat);
        Rewrite(F);
        WriteLn(F, Format('DEL "%s"', [Application.ExeName]));
        WriteLn(F, Format('DEL "%s"', [Bat]));
        CloseFile(F);
        WinExec(PChar(Bat), SW_HIDE);
        Application.Terminate;

     end;
end;
end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Ae Jhonas, Micheus Vlwwww Cara!!!

¬¬

O Jhonas Mesmo Assim Não Funcionou!!! ;)

Mais com Seus Exemplos Ajudou MuitoO Muito Mesmo...

Eu já Tive Altas Ideias para Outras Coisas... Vlw mesmo //

E

Micheus:

Cara eu nunca Penssei Nisso!!!

é mesmo Muito Boa Idéia Dessa Forma Nunca irá Falhar!!!

Sem Palavras Obrigado Pela Paciência e a Atenção... <>

Vlw...

Abraço// {Resolvido}

Editado por Jhonatas araujo
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...