【问题标题】:Delphi example of using TTaskDIalog for progress indicationDelphi 使用 TTaskDIalog 进行进度指示的示例
【发布时间】:2014-11-02 03:49:08
【问题描述】:

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

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

【问题讨论】:

标签: delphi ttaskdialog


【解决方案1】:

如果您将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;

【讨论】:

  • 上述方法你真的试过了吗?我试过了,设置位置并没有改变任何东西。仅当我在执行之前设置位置时,它才会在执行时以动画形式显示。有时间我会尝试更多。
  • 稍后我将不得不在办公室验证 D2007 是否存在一些特殊问题。从您的扩展问题中描述的行为看来,您的工作循环正在阻塞,这就是为什么我的回答是在谈论具有线程保存属性的线程,您是否使用我的回答中所示的原版项目进行了验证?
  • 糟糕。我没有真正注意你的阻塞和线程注释。可能就是这样。我会尝试做一个小项目。谢谢。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多