How to countdown in a MessageBox

2

Usage Delphi XE7 , needed to countdown to MessageBox , Não button. For example a count of 10 sec next to the caption of the Não (10) button and so it decreases Não (9) .

My alternative is to create the dialogue itself and make the changes that I need. But first I wanted to know if it's possible to make this change in MessageBox or MessageDlg .

    
asked by anonymous 15.03.2017 / 19:56

2 answers

1

I have a form where in it I have two buttons, and in one of them I use a timer to enable

No FormShow

procedure TfrmMensagem.FormShow(Sender: TObject);
begin
  inherited;
  fCaption := btn1.Caption;

  a1 := 2;
  a2 := 0;

  if (Timer1.Enabled) then
  begin
    btn1.Caption := 'Aguarde ('+IntToStr(a1)+')';
    btn1.Enabled := false;
  end;

  scrlbx.SetFocus;
end;

No Timer

procedure TfrmMensagem.Timer1Timer(Sender: TObject);
var msg: string;
begin
  inherited;
  btn1.Enabled := false;
  if (a2 = 0) then
  begin
    a1 := a1 - 1;

    msg := 'Aguarde ('+IntToStr(a1)+')';

    btn1.Caption := msg;

    if (a1 = 0) then
    begin
      btn1.Enabled := True;
      Timer1.Enabled := false;

      a2 := 1;
      a1 := 2;

      btn1.Caption := fCaption;
      if btn1.Visible then
        btn1.SetFocus;
    end;
  end;
end;

And I have a class to work with this form unit Message;

interface

uses SysUtils, Classes, Controls, Forms, StdCtrls;

type
  TTipoMensagem = (tmConfirmacao, tmAtencao);

  TMensagem = class
    fLimparMensagens : Boolean;
    private
      fMensagem : TStrings;
      fTipoMensagem : TTipoMensagem;

      procedure CriaLabels;
      procedure ConfiguraForm;

    public
      NumeroMensagens : Integer;

      constructor Create;
      destructor Destroy; override;

      procedure Ordenar;
      procedure Adicionar(Mensagem : String);
      procedure SetTipo(TipoMensagem : TTipoMensagem);
      procedure Limpar;
      function Show(Mensagem : String = ''; TipoMensagem : TTipoMensagem = tmAtencao; Timer: Boolean = false) : TModalResult;
  end;

implementation

uses UMensagem;

{ TMessageForm }

constructor TMensagem.Create;
begin
  fLimparMensagens := True;
  fMensagem        := TStringList.Create;
  NumeroMensagens  := fMensagem.Count;
end;

destructor TMensagem.Destroy;
begin
  FreeAndNil(fMensagem);
  inherited;
end;

procedure TMensagem.Adicionar(Mensagem : String);
begin
  fMensagem.Add(WrapText(Mensagem, 100));
  NumeroMensagens := fMensagem.Count;
end;

procedure TMensagem.Limpar;
begin
  fMensagem.Clear;
  NumeroMensagens := fMensagem.Count;
end;

procedure TMensagem.ConfiguraForm;
begin
  case fTipoMensagem of
    tmConfirmacao :
      begin
        frmMensagem.Caption:='Confirme';
        frmMensagem.btn1.Caption:='Sim';
        frmMensagem.btn1.ModalResult:=mrYes;
        frmMensagem.btn2.Caption:='Não';
        frmMensagem.btn2.ModalResult:=mrNo;
      end;
    tmAtencao :
      begin
        frmMensagem.Caption:='Atenção';
        frmMensagem.btn1.Visible:=False;
        frmMensagem.btn2.Caption:='OK';
        frmMensagem.btn2.ModalResult:=mrOk;
      end;
  end;
end;

procedure TMensagem.CriaLabels;
var count : integer;
    l : TLabel;
begin
  for count:=0 to fMensagem.Count-1 do
  begin
    l:=TLabel.Create(frmMensagem);
    l.Parent:=frmMensagem.scrlbx;
    l.Caption:=fMensagem[count];
    l.Left := 6;
    l.Top := count * 17 + 4;
  end;
end;

function TMensagem.Show(Mensagem : String = ''; TipoMensagem : TTipoMensagem = tmAtencao; Timer: Boolean = false) : TModalResult;
begin
  try
    fTipoMensagem := TipoMensagem;
    frmMensagem := TfrmMensagem.Create(nil);
    frmMensagem.Timer1.Enabled := Timer;

    ConfiguraForm;
    if Mensagem <> '' then
      Adicionar(Mensagem);
    CriaLabels;

    if NumeroMensagens > 0 then
      Result := frmMensagem.ShowModal
    else Result := mrNone;
  finally
    FreeAndNil(frmMensagem);
  end;

  if fLimparMensagens then
     Limpar;
end;

procedure TMensagem.Ordenar;
begin
  (fMensagem as TStringList).Sort;
end;

procedure TMensagem.SetTipo(TipoMensagem: TTipoMensagem);
begin
  fTipoMensagem := TipoMensagem;
end;

end.

When I need to use it, I do the following:

if fMensagem.Show('Você deseja realmente finalizar a operação ' + aTipo + '?', tmConfirmacao, True) = mrYes then
    
15.03.2017 / 20:33
1

Another alternative is to use the MessageBoxTimeOut function. It is native to Windows, although it is not documented in unit Windows.pas . Details of their use can be found on the Embarcadero website. The function does not display a second countdown timer, but closes the MessageBox automatically, according to the defined parameter.

    
16.03.2017 / 12:36