Delphi使用TTaskDIalog进行进度指示的示例

时间:2014-11-02 03:49:08

标签: delphi ttaskdialog

我找不到在Delphi中使用TTaskDialog来显示进度条的示例。就TTaskDialog而言,Embarcadero文档根本没有帮助。

我找到的最佳指南:

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

我基于bummi答案的TTaskDialog实验显示如下:

  • 计时器事件对进度条的更新没有帮助。该事件被触发,但即使使用updatewindow调用,也不会显示计时器事件中进度条的任何更新。
  • 无法以无模式启动对话框,因此即使以某种方式使计时器事件更新进度条,逻辑也必须进行大量更改才能继续处理计时器事件。
  • 可以显示进度条位置的唯一方法是在执行前设置它。从这个意义上说,它的工作原理与SilverWarior的回答完全相同。它的可能用途似乎是,在具有新进度条位置的循环操作中显示,仅当您需要从用户获得下一个按钮响应时。所以这似乎是正确的答案,但我会等待更多回复此更新。

P.S。我使用Delphi 2007进行此测试。因此,我不知道进度条是否从计时器更新为后来的IDE工作。但我对此表示怀疑,因为即使是D2007代码也会在内部发送标准的TaskDialog消息以更新进度条。

2 个答案:

答案 0 :(得分:3)

如果您将tfCallbackTimer添加到Flags OnTimer - 事件将每秒触发5次。
由于对话框是阻塞的,因此用例可能是一个线程正在复制具有进度的胎面保存属性的文件 在计时器内,您可以反映当前的进度。

enter image description here

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;

答案 1 :(得分:-3)

正如@David Heffernan已经在他的合作中指明的那样,TTaskDialog并不打算成为进步对话。

确实可以在TTaskDialog中显示ProgressBar,但是在显示对话框时无法更新此ProgressBar。

TTaskDialog的ProgressBar更适用于您具有长时间操作的情况,并且在该操作的最后阶段,您需要用户做出一些决定,以便您在继续之前等待他的输入。
例如,复制多个文件,然后请求用户确认重写有效文件。现在,您仍然可以向用户显示目前为止向他显示决策对话框的进度。

为了显示TTaskDialog的ProgressBar,为正常进度条添加“tfShowProgressBar”标志,或为marque progressbar添加“tfShowMarqueeProgressBar”标志。

您可以像任何普通的ProgressBar(Min,Max,Position)一样设置ProgressBar值,但在显示对话框时无法更新这些值。

编辑:您可以阅读有关可在此处使用的可用标志的更多信息

http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.Dialogs.TCustomTaskDialog.Flags