Friday October 16, 2009in Delphi TIPS :: Let's say you have a standard Windows dialog box displaying a question to the user with "Yes" and "No" (confirm) buttons. Wouldn't it be great if a progress bar could be displayed within a dialog box "counting" seconds until the dialog box automatically closes itself?
Read the full article to learn how to Place a Progress Bar Inside a Standard MessageBox in Delphi Apps
Let's say you have a standard Windows dialog box displaying a question to the user with "Yes" and "No" buttons. Wouldn't it be great if a progress bar could be displayed within a dialog box "counting" seconds until the dialog box automatically closes itself?
- We first create a dialog using CreateMessageDialog
- This function will return a form object with dialog
- In this object we can add a ProgressBar
- We also add a Timer object for dynamic progress bar position update
- Show dialog using ShowModal
- Handle the OnTimer event of the TTimer component to see if the elapsed number of seconds has passed - if so, we close the dialog by setting the ModalResult property, from code, to mrCancel.
- If not, we use StepIt to update the progressbar.
procedure TForm1.Button1Click(Sender: TObject) ;
AMsgDialog : TForm;
AProgressBar : TProgressBar;
ATimer : TTimer;
AMsgDialog := CreateMessageDialog('Quickly! Answer Yes or No!', mtWarning, [mbYes, mbNo]) ;
AProgressBar := TProgressBar.Create(AMsgDialog) ;
ATimer := TTimer.Create(AMsgDialog) ;
with AMsgDialog do
Tag := 10; //seconds!
Caption := 'You have 10 seconds';
Height := 150;
with AProgressBar do begin
Name := 'Progress';
Parent := AMsgDialog;
Max := AMsgDialog.Tag; //seconds
Step := 1;
Top := 100;
Left := 8;
Width := AMsgDialog.ClientWidth - 16;
with ATimer do
Interval := 1000;
case ShowModal of
ID_YES: ShowMessage('Answered "Yes".') ;
ID_NO: ShowMessage('Answered "No".') ;
ID_CANCEL: ShowMessage('Time up!')
ATimer.OnTimer := nil;
//make sure you add this function's header in the private part of the TForm1 type declaration.
procedure TForm1.DialogTimer(Sender: TObject) ;
aPB : TProgressBar;
if NOT (Sender is TTimer) then Exit;
if ((Sender as TTimer).Owner) is TForm then
with ((Sender as TTimer).Owner) as TForm do
aPB := TProgressBar(FindComponent('Progress')) ;
if aPB.Position >= aPB.Max then
ModalResult := mrCancel