我的Delphi应用程序的一部分访问来自另一个程序的信息。因为执行可能需要一些时间,有时其他程序可能没有响应,所以我在一个单独的线程中运行这部分代码。
为了让我的用户了解后台线程的进度,我在启动线程后执行TaskDialog。我将一个指向TaskDialog的指针传递给我的线程,这样线程就可以与TaskDialog同步,以便在线程进行时更新它。当线程完成时,我使用PostMessage(CurrentTaskDialog.Handle, WM_CLOSE, 0, 0);
向TaskDialog发送一条关闭消息
到目前为止一切正常,但如果用户单击TaskDialog上的cancel按钮(这是TaskDialog中唯一的按钮(,我想取消该过程。我不知道该怎么做。无论用户是点击按钮还是TaskDialog收到关闭消息,ModalResult
始终是mrCancel
。我尝试在线程中分配一个不同的ModalResult
,但它的计算结果仍然是mrCancel
。
有什么办法可以做到这一点吗?
根据TaskDialogIndirect()
文档,您所描述的是正常行为:
pnButton
型号:
int*
接收以下任一项的变量的地址:
在
pTaskConfig
参数的pButtons
成员中指定的按钮ID之一以下值之一:
- 0:函数调用失败。有关详细信息,请参阅返回值
- IDCANCEL:选择了"取消"按钮,按下了Alt-F4,按下了Escape,或者用户单击了关闭窗口按钮
- IDNO:未选择任何按钮
- IDOK:已选择"确定"按钮
- IDRETRY:已选择"重试"按钮
- IDYES:选择了"是"按钮
由于您只有一个Cancel按钮,并且正在模拟关闭按钮按下,因此TaskDialogIndirect()
始终报告IDCANCEL
,这就是为什么ModalResult
始终为mrCancel
的原因。没有办法区分实际原因(除了挂起对话框窗口本身(。
在任何情况下,您实际上根本不需要使用ModalResult
来完成您想要的任务。
当对话框因任何原因关闭时,只需向线程发出结束信号,然后等待线程完全退出。如果线程在对话框关闭之前已经结束,则信号将被忽略,等待将立即得到满足。
然后你可以更进一步。您可以在TaskDialog的CommonButtons
属性中使用自定义按钮,而不是在TaskDialog的tcbCancel
属性中使用CCD_16,然后使用TaskDialog中的OnButtonClicked
事件来通知线程退出。阻止对话框自动关闭(通过在事件处理程序中设置CanClose=False
(,并等待线程在完成时关闭对话框。这将允许您在等待线程结束的同时继续在TaskDialog中显示反馈,例如显示";"等待";消息而在另一种方法中,当用户单击标准的"取消"按钮时,TaskDialog窗口将关闭,因此即使线程可能仍在运行,也无法再显示反馈。