Programa em intervalo de hora

20/08/2019

0

Bom dia.
Preciso de ajuda para que o sistema só funcione no intervalo de horas determinado.
Por exemplo: o sistema só vai funcionar das 08:00 - 12:00 e das 13:00 - 18:00.
Fora desse intervalo o sistema da um ShowMessage e encerra a aplicação automaticamente.
Se alguém tem alguma ideia agradeço.
Jordan Bernardes

Jordan Bernardes

Responder

Post mais votado

20/08/2019

uma das formas é ter um timer numa thread. segue um exemplo:
unit ThreadHorarioPermitido;

interface

uses
  System.Classes, Vcl.ExtCtrls, System.SysUtils, WinAPI.Windows;

type
  THorarioPermitido = class(TThread)
  private
    { Private declarations }
    Relogio: TTimer;
    procedure Temporizador(Sender: TObject);
  protected
    procedure Execute; override;
  public
    constructor create; overload;
    destructor Destroy; override;
  end;

const
  cHr1Ini: pchar = '08:00:00';
  cHr1Fim: pchar = '12:00:00';
  cHr2Ini: pchar = '13:00:00';
  cHr2Fim: pchar = '18:00:00';

implementation

{ THorarioPermitido }

constructor THorarioPermitido.create;
begin
  Relogio := TTimer.Create(nil);
  Relogio.Enabled := False;
  Relogio.Interval := 1000; // 1 segundo
  Relogio.OnTimer := Temporizador;
  Relogio.Enabled := True;

  inherited create;
end;

destructor THorarioPermitido.Destroy;
begin

  inherited;
end;

procedure THorarioPermitido.Execute;
begin
  { Place thread code here }
end;

procedure THorarioPermitido.Temporizador(Sender: TObject);
begin
  if not ( ( (TimeToStr(Time) >= cHr1Ini) and (TimeToStr(Time) <= cHr1Fim) ) or
           ( (TimeToStr(Time) >= cHr2Ini) and (TimeToStr(Time) <= cHr2Fim) )
         ) then
  begin
    Relogio.Enabled := False;
    FreeAndNil(Relogio);
    MessageBox(0,pchar('Horário não disponível para utilização do sistema.'+chr(13)+chr(13)+
                 'O sistema pode ser utilizado das '+cHr1Ini+' as '+cHr1Fim+' e das '+cHr2Ini+' as '+cHr2Fim),
                 'Uso não autorizado',mb_iconerror);
    Halt;
  end;
end;

end.
Altere as constantes cHr1Ini, cHr1Fim, cHr2Ini e cHr2Fim conforme sua necessidade. Note que a verificação será feita a cada segundo. O intervalo pode ser alterado na propriedade Relogio.Interval.

Para utilizar, inclua a unit ThreadHorarioPermitido na cláusula uses do projeto (se não estiver declarada ali) e adicione a linha para criação da thread.
algo assim:
program Project6;

uses
  Vcl.Forms,
  Unit5 in 'Unit5.pas' ,
  Unit1 in 'Unit1.pas' ,
  ClasseTags in 'ClasseTags.pas',
  ThreadHorarioPermitido in 'ThreadHorarioPermitido.pas'; // << unit da thread de controle do horário de uso

{$R *.res}

var
  Form5: TForm5;
  HorarioPermitido: THorarioPermitido; // << variável para instância da thread

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;

  HorarioPermitido := THorarioPermitido.create; // << cria a instância da thread (e executa)

  Application.CreateForm(TForm5, Form5);
  Application.Run;
end.


Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

20/08/2019

Manoel Junior

Bom dia. Se ele deve ser iniciado automaticamente, é necessário criar tarefas no agendador de tarefas do Windows. No próprio site da Microsoft disponibiliza a criação da tarefa por um script, xml ou c++: https://docs.microsoft.com/en-us/windows/win32/taskschd/starting-an-executable-at-a-spcific-time . Então, no Delphi será necessário apenas usar o CreateProcess para executar o script pelo CMD.
Responder

28/08/2019

Jordan Bernardes

Emerson primeiramente muito obrigado por sua atenção. Mais devido há uma alteração operacional o horário de funcionamento do software alterou para as 08:00 á 18:00 isso acabou facilitando um pouco. Fiz da seguinte forma, utilizei três componentes TTimeEdit com os nomes temp1, tempv2 e tempv3 dois timers. O timer1 fica atualizando o temp1
 temp1.Time:= Now; 
. E o outro timer fiz o seguinte,
 
if (temp1.Time < tempv1.Time) or (temp1.Time > tempv2.Time) then
begin
Timer2.Enabled:= False;
MessageDlg('O horario de funcionamento do aplicativo é das 08:00h à 18:00h',
    System.UITypes.TMsgDlgType.mtInformation,
    [System.UITypes.TMsgDlgBtn.mbOK], 0,
    procedure(const BotaoPressionado: TModalResult)
      begin
        case BotaoPressionado of
          mrOk: begin
              Application.Terminate;
            end;
        end;
      end
    );
end; 
.
E no tempv1 na propriedade time informei a hora 08:00:00 e no tempv2 na propriedade time informei a hora 18:00:00.

Muito obrigado.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar