1

我找不到在 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 的答案中描述的完全一样。它的可能用途似乎是,仅当您需要从用户那里获得下一个按钮响应时,才在具有新进度条位置的循环操作中显示。所以这似乎是正确的答案,但我会等待对此更新的更多回复。

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

4

2 回答 2

3

If you add tfCallbackTimer to the Flags the OnTimer- Event will be triggered 5 times per second.
Since the dialog is blocking a use case could be having a thread copying files with a tread save property for the progress.
Within the timer you are able to reflect the current progress.

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;
于 2014-11-02T07:46:25.817 回答
-3

正如@David Heffernan 已经在他的 cooment 中指定的那样,TTaskDialog 并不打算用作进度对话框。

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

TTaskDialog 的 ProgressBar 更适用于您有冗长操作的场景,并且在该操作中您需要用户做出一些决定,以便您在继续之前等待他的输入。
例如复制多个文件,然后请求用户确认以重写现有文件。现在,您仍然可以在向用户显示决策对话框的同时向用户显示到目前为止已经取得了多少进展。

为了显示 TTaskDialog 的 ProgressBar,为普通进度条添加“tfShowProgressBar”标志或为标记进度条添加“tfShowMarqueeProgressBar”标志。

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

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

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

于 2014-11-02T04:32:24.217 回答