Jump to content
Fórum Script Brasil
  • 0

X Tempo Fazer Y Ação


Jhonatas araujo

Question

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 to comment
Share on other sites

14 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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...

Edited by Jhonatas araujo
Link to comment
Share on other 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 to comment
Share on other 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 .

Edited by Jhonatas araujo
Link to comment
Share on other 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 to comment
Share on other 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 ...

Edited by Jhonatas araujo
Link to comment
Share on other 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 to comment
Share on other 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 ...

Edited by Jhonatas araujo
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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}

Edited by Jhonatas araujo
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...