Thursday, October 22, 2009

Delphi Tips: Menambahkan Progress Bar di dalam Standard MessageBox

Misalkan anda punya sebuah standard Windows dialog box yang menampilkan pertanyaan kepada user dengan tombol konfirmasi "Yes" dan "No". Bisakah kita menampilkan sebuah progress bar di dalam dialog box tersebut yang akan memberikan "time-out" sampai dialog box tersebut tertutup dengan sendirinya?

  1. Pertama bikin sebuah dialog box dengan CreateMessageDialog
  2. Fungsi ini akan menghasilkan form object disertai dialog
  3. Pada object ini kita bisa menambahkan sebuah ProgressBar
  4. Kita juga bisa menambahkan sebuah Timer object untuk melakukan update secara dinamis posisi progress bar
  5. Tampilkan dialog dengan ShowModal
  6. Masukkan script ke dalam event OnTimer dari komponen TTimer untuk mengetahui apakah detik/waktu time-out telah dicapai - jika sudah, tutuplah dialog dengan mengatur property ModalResult secara coding menjadi mrCancel.
  7. Jika belum, gunakan StepIt untuk mengupdate posisi progressbar.

Taruklah sebuah TButton (Button1) pada sebuah form (Form1), dan coba code berikut ini:

~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.Button1Click(Sender: TObject) ;
var
AMsgDialog : TForm;
AProgressBar : TProgressBar;
ATimer : TTimer;
begin
AMsgDialog := CreateMessageDialog('Quickly! Answer Yes or No!', mtWarning, [mbYes, mbNo]) ;
AProgressBar := TProgressBar.Create(AMsgDialog) ;
ATimer := TTimer.Create(AMsgDialog) ;
with AMsgDialog do
try
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;
end;

with ATimer do
begin
Interval := 1000;
OnTimer:=DialogTimer;
end;

case ShowModal of
ID_YES: ShowMessage('Answered "Yes".') ;
ID_NO: ShowMessage('Answered "No".') ;
ID_CANCEL: ShowMessage('Time up!')
end;//case
finally
ATimer.OnTimer := nil;
Free;
end;
end;


//make sure you add this function's header in the private part of the TForm1 type declaration.
procedure TForm1.DialogTimer(Sender: TObject) ;
var
aPB : TProgressBar;
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;

0 Comments: