在Delphi中以异步方式打开模态对话框

时间:2010-11-22 06:06:33

标签: delphi

通常,当您使用ShowModal打开对话框时,当前线程的执行将停止,直到对话框关闭。我想显示一个模态对话框,但在对话框仍处于打开状态时继续在当前线程上执行。

通过“模态”,我只是意味着在模态对话框关闭之前,用户无法与应用程序的任何其他形式进行交互。

Delphi ShowModal函数提供了与我所需要的“模态”略有不同的定义:

  

模式表单是在表单关闭之前应用程序无法继续运行的表单。

目前我的代码如下:

dialog.Parent:=self;
dialog.Show;
// keep doing stuff...

这是有效的,除了我仍然可以与父窗口交互(移动它,关闭它等)

如何在不使用ShowModal的情况下显示阻止用户与父窗口交互的表单?

3 个答案:

答案 0 :(得分:6)

打开Delphi \ Source \ VCL \ Forms.pas的源代码并打开ShowModal的实现。然后了解它是如何工作的。我不能在这里复制源代码,因为它是CodeGear的IP,但您可以轻松地自己完成并重用其部分代码。

答案 1 :(得分:6)

即使打开了模态窗体,主线程仍然会执行(否则模态窗体无法自行重绘)。

然而,模态窗体有自己的事件循环,阻止原始应用程序事件循环执行。

他们必须(就像Windows消息框一样),否则你可能会有一个事件潜入主事件循环,创建另一个模态表单或消息框。

这种做法否定了模态的全部要点:每个UI线程只能有一个模态形式或消息框。

所以你需要问自己这个问题:

What actions in the main event loop does this modal form prevent from happening?

然后将这些操作移动到一个单独的线程中。

- 的Jeroen

答案 2 :(得分:5)

只要您的对话框可见,就会停用您的父表单,这会阻止用户进行交互。您还可以使用DisableTaskWindows禁用所有表单,而不仅仅是父表单。它没有记录,但您可以在'forms.pas'的TCustomForm.ShowModal中看到它是如何使用的。