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

f87krz0w  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(198)

我找不到在 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

我在TTaskDialog上的实验基于bummi的答案,结果如下:

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

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

njthzxwz

njthzxwz1#

如果您将tfCallbackTimer添加到Flags,则OnTimer- Event将每秒触发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;

相关问题