Delphi пример использования TTaskDIalog для индикации прогресса
Я не могу найти пример использования TTaskDialog в Delphi для отображения индикатора выполнения. Документы Embarcadero не очень полезны для TTaskDialog.
Лучший гид, который я нашел:
http://specials.rejbrand.se/TTaskDialog
не содержит образца для отображения индикатора выполнения.
Я вижу различные флаги в исходном тексте Delphi для индикатора выполнения, но для того, чтобы их опробовать, я понятия не имею, как можно отобразить диалоговое окно задачи без режима, чтобы поэкспериментировать с флагами.
Обновление: я пришел к выводу, что диалоговое окно задач не может использоваться традиционным способом, как немодальные диалоговые окна прогресса. Вот что я обычно делаю для длительных операций:
show progress dialog modeless
start a loop to do work
... update progress bar in above dialog (often on a modulo count)
... check for cancel and abort if needed
remove progress dialog
Мои эксперименты с TTaskDialog, основанные на ответе bummi, показывают следующее:
- Событие таймера не помогает при обновлении индикатора выполнения. Событие запускается, но любые обновления индикатора выполнения в событии таймера не отображаются даже при вызове updatewindow.
- Диалог не может быть запущен без режима, поэтому даже если событие таймера каким-то образом сделано для обновления индикатора выполнения, логика должна значительно измениться, чтобы продолжить работу с событием таймера.
- Единственный способ показать положение индикатора выполнения - установить его перед выполнением. В этом смысле он работает именно так, как описано в ответе SilverWarior. Вероятно, его использование будет отображаться в циклической операции с новой позицией индикатора выполнения, только когда вам нужно получить следующий пользовательский ответ на кнопку. Так что это, кажется, правильный ответ, но я буду ждать больше ответов на это обновление.
PS Я использовал Delphi 2007 для этого теста. Так что я не знаю, работают ли обновления индикатора времени от таймера для более поздней IDE. Но я сомневаюсь в этом, потому что даже код D2007 внутренне отправляет стандартное сообщение TaskDialog для обновления индикатора выполнения.
2 ответа
Если вы добавите tfCallbackTimer
к Flags
OnTimer
- Событие будет запускаться 5 раз в секунду.
Поскольку диалоговое окно блокируется, в сценарии использования может быть поток, копирующий файлы со свойством сохранения протектора для прогресса.
В таймере вы можете отразить текущий прогресс.
begin
TaskDialog1.ProgressBar.Min := 0;
TaskDialog1.ProgressBar.Max := 100;
TaskDialog1.Execute;
end;
procedure TMyForm.TaskDialog1Timer(Sender: TObject; TickCount: Cardinal; var Reset: Boolean);
begin
// TaskDialog1.ProgressBar.Position := MyThread.CurrentProgressPercent;
// Demo
TaskDialog1.ProgressBar.Position := TaskDialog1.ProgressBar.Position + 1;
end;
Как уже указывал @David Heffernan в своем предложении, TTaskDialog не является диалогом прогресса.
Это правда, что вы можете отобразить ProgressBar внутри TTaskDialog, но вы не можете обновить этот ProgressBar, пока отображается диалоговое окно.
ProgressBar TTaskDialog больше предназначен для сценариев, в которых вы выполняете длительную операцию, и в самом начале этой операции вам требуется, чтобы пользователь принял какое-то решение, поэтому вы ждете его ввода, прежде чем продолжить.
Например, копирование тысяч файлов, а затем запрос подтверждения пользователя для перезаписи существующих. Теперь вы все еще можете показывать пользователю, какой прогресс был достигнут до сих пор, покажете ему диалог принятия решения.
Чтобы отобразить ProgressBar TTaskDialog, добавьте флаг "tfShowProgressBar" для обычного индикатора выполнения или "tfShowMarqueeProgressBar" для индикатора прогрессивной области.
Вы можете установить значения ProgressBar, как с любым обычным ProgressBar (Min, Max, Position), но вы не можете обновить их, пока отображается диалоговое окно.
РЕДАКТИРОВАТЬ: Вы можете прочитать больше о доступных флагах, которые могут быть использованы здесь
http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Dialogs.TCustomTaskDialog.Flags