Como inserir uma barra de progresso dentro de uma caixa de diálogo

Vamos supor que você possui uma caixa de diálogo padrão do Windows, exibindo uma pergunta ao usuário, com os botões “Sim” e “Não”. Não seria legal se uma barra de progresso pudesse ser exibida dentro da caixa de diálogo e que “contasse” os segundos até que a caixa de mensagem fosse fechada automaticamente?

1.      Primeiro criamos um diálogo utilizando CreateMessageDialog;

2.      Esta função retorna um objeto formulário com o diálogo;

3.      Neste objeto, podemos adicionar uma barra de progresso;

4.      Além disso, adicionamos um Timer para atualizar a barra de progresso dinamicamente

5.      Exibimos o diálogo utilizando ShowModal

6.      Implementamos o evento OnTimer do Timer para verificar se o tempo limite foi atingido – caso verdadeiro, fechamos o diálogo alterando a propriedade ModalResult, pelo código, para mrCancel

7.      Caso contrário, utilizamos StepIt para atualizar a barra de progresso

Adicione um Button (Button1) a um formulário (Form1), e experimente seguinte código:

 

procedure TForm1.Button1Click(Sender: TObject) ;

var

  AMsgDialog: TForm;

  AProgressBar: TProgressBar;

  ATimer: TTimer; { uses ExtCtrls }

begin

  AMsgDialog := CreateMessageDialog('Rápido! Resposta Sim ou Não', mtWarning, [mbYes, mbNo]);

  AProgressBar := TProgressBar.Create(AMsgDialog);

  ATimer := TTimer.Create(AMsgDialog);

  with AMsgDialog do

  try

    Tag := 10; //segundos

    Caption := 'Você tem 10 segundos';

    Height := 150;

    with AProgressBar do

    begin

      Name := 'Progress';

      Parent := AMsgDialog;

      Max := AMsgDialog.Tag; //segundos

      Step := 1;

      Top := 100;

      Left := 8;

      Width := AMsgDialog.ClientWidth - 16;

    end;

    with ATimer do

    begin

      Interval := 1000;

      OnTimer := DialogTimer;

    end;

    case ShowModal of

     ID_YES: ShowMessage('Respondeu "Sim".');

     ID_NO: ShowMessage('Respondeu "Não".');

     ID_CANCEL: ShowMessage('Tempo estourado!')

    end;

   finally

    ATimer.OnTimer := nil;

    Free;

   end;

end;

 

//certifique-se que o cabeçalho da função foi adicionado à seção private

procedure TForm1.DialogTimer(Sender: TObject) ;

var

  aPB: TProgressBar; { uses ComCtrls }

begin

  if NOT (Sender is TTimer) then

    Exit;

  if ((Sender as TTimer).Owner) is TForm then

  with ((Sender as TTimer).Owner) as TForm do

  begin

    aPB := TProgressBar(FindComponent('Progress')) ;

    if aPB.Position >= aPB.Max then

      ModalResult := mrCancel

    else

      aPB.StepIt;

  end;

end;