Помещаем ProgressBar в стандартное диалоговое окно
Допустим, у Вас имеется стандартное диалоговое окно Windows с вопросом и кнопками "Да" и "Нет". Но было бы лучше, чтобы ProgressBar отображался в окне и показывал остаток времени, пока окно не закроется?
Для воплощения этого замысла проделаем следующее:
- Сначала создадим диалог, используя CreateMessageDialog
- Эта функция возвратит объект формы с диалогом
- В этот объект мы можем добавить ProgressBar
- Также мы добавим объект Timer для динамического обновления позиции
- Отображаем диалог, используя ShowModal
- Обрабатываем событие OnTimer компонента TTimer, чтобы проверить, прошло ли определенное количество секунд, если да, то закрываем диалоговое окно, устанавливая свойство ModalResult в mrCancel
- Если нет, то используем StepIt, чтобы обновить ProgressBar
Поместите кнопку TButton (Button1) на форму (Form1) и напишите следующий код:
procedure TForm1.Button1Click(Sender: TObject) ;
var
AMsgDialog : TForm;
AProgressBar : TProgressBar;
ATimer : TTimer;
begin
AMsgDialog := CreateMessageDialog('Быстро! Ответ ДА или НЕТ!', mtWarning, [mbYes, mbNo]) ; AProgressBar := TProgressBar.Create(AMsgDialog) ; ATimer := TTimer.Create(AMsgDialog) ;
with AMsgDialog do
try
Tag := 10; //секунды!
Caption := 'У Вас 10 секунд';
Height := 150; with AProgressBar do begin Name := 'Progress';
Parent := AMsgDialog;
Max := AMsgDialog.Tag; //секунды
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('Ответил "ДА".') ;
ID_NO: ShowMessage('Ответил "НЕТ".') ;
ID_CANCEL: ShowMessage('Время вышло!')
end;//case
finally
ATimer.OnTimer := nil;
Free;
end; end;
// Убедитесь, что Вы добавили эту функцию в части private объявления типа TForm1 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;
|