【问题标题】:Delphi TTaskDialog show/hide or start/stop marquee progress barDelphi TTaskDialog 显示/隐藏或启动/停止选框进度条
【发布时间】:2020-03-27 12:23:22
【问题描述】:

我有一个TTaskDialog,它有一个OnButtonClicked 事件处理程序,其中执行了一个漫长的过程(几秒钟)。这很好用,但我想向用户表明事情正在发生,而这个漫长的过程正在进行中。我想在最初隐藏的对话框上有一个选框进度条,在单击CommandLink 时出现,并在执行冗长的过程时运行 - 我会选择一个可见但未启用的进度条在OnButtonClicked 事件中显示并“打开”对话框。仅包含tfShowMarqueeProgressBar 标志会导致该栏在对话框首次显示时出现并滚动,并且对话框的ProgressBar 属性没有EnabledVisible 类型属性来控制此行为。

Windows 本身有 TaskDialogs 可以做我想做的事,所以我知道这在理论上是可能的,尽管我意识到围绕本机控件的 VCL 包装器的结构可能使使用 VCL 对象变得困难或不可能。

使用TTaskDialog VCL 对象可以实现我想要的吗?

【问题讨论】:

  • 您大概可以使用原始的 Win32 API。这就是我一直这样做的方式。
  • 我使用来自@Arnaud Bouchez 的SynTaskDialog wrapper unit

标签: delphi ttaskdialog


【解决方案1】:

Windows API 提供消息TDM_NAVIGATE_PAGE 以在运行时更改TaskDialog。您必须将TASKDIALOGCONFIG 结构与定义对话框属性的此消息一起传递。在其dwFlags 字段中,您可以指定TDF_SHOW_PROGRESS_BAR 标志来显示进度条。但这需要做很多工作,因为 TASKDIALOGCONFIG 结构中的其他字段必须与您为 Delphi 的 TTaskDialog 组件设置的属性匹配。

Delphi 在Dialogs.pas 中的函数TCustomTaskDialog.DoExecute 中创建一个TASKDIALOGCONFIG 结构作为局部变量,用于显示TaskDialog。

【讨论】:

  • 尝试使用内置包装器毫无意义。直接进入底层api即可。
  • 谢谢大家。我最终将冗长的处理推迟到在后台线程中完成的日常清理过程。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多