Внешний вид сайта:

Помещаем ProgressBar в стандартное диалоговое окно

Допустим, у Вас имеется стандартное диалоговое окно Windows с вопросом и кнопками «Да» и «Нет». Но было бы лучше, чтобы ProgressBar отображался в окне и показывал остаток времени, пока окно не закроется?

Диалоговое окно

Для воплощения этого замысла проделаем следующее:

  1. Сначала создадим диалог, используя CreateMessageDialog
  2. Эта функция возвратит объект формы с диалогом
  3. В этот объект мы можем добавить ProgressBar
  4. Также мы добавим объект Timer для динамического обновления позиции
  5. Отображаем диалог, используя ShowModal
  6. Обрабатываем событие OnTimer компонента TTimer, чтобы проверить, прошло ли определенное количество секунд, если да, то закрываем диалоговое окно, устанавливая свойство ModalResult в mrCancel
  7. Если нет, то используем 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;

Обратите внимание: Вам тоже захочется посмотреть!

Комментарии

Нет комментариев. Ваш будет первым!