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;