How to count down in a Messagebox

Asked

Viewed 1,031 times

2

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

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

  • 1

    I see possibilities if you create your own component, or create a form to simulate messagebox or messagedlg. Apart from that the way seems quite difficult.

  • @Reginaldorigo, it will be the way, to leave for the own dialog

2 answers

1

Another alternative is to use the function Messageboxtimeout. It is native to Windows, although it is not documented in Unit Windows..
Details of its use can be found on the website itself Embarcadero.
The function does not display a second countdown, but closes the Messagebox automatically, according to the defined parameter.

  • I had already seen this function, the idea is good, but I’m still aiming to set up the dialog itself, so I can make the changes I need. Do straight on Messagebox or Messagedlg, I see that it will be difficult to apply this rule.

1

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

In the 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;

In the 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 that form Unit Mensagem;

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 this:

if fMensagem.Show('Você deseja realmente finalizar a operação ' + aTipo + '?', tmConfirmacao, True) = mrYes then
  • Very good your answer, but I’m still trying to see if you have how to make this change in Messagebox or Messagedlg if I’m not successful, your answer will be of great help.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.