确定在Delphi中关闭任务对话框的原因



我的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窗口将关闭,因此即使线程可能仍在运行,也无法再显示反馈。

最新更新