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

awm*_*oss 6 delphi

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

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

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

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

目前我的代码如下:

dialog.Parent:=self;
dialog.Show;
// keep doing stuff...
Run Code Online (Sandbox Code Playgroud)

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

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

Eug*_*its 6

打开德尔福\来源\ VCL\Forms.pas的源代码和开放实现的ShowModal的.然后了解它是如何工作的.我不能在这里复制源代码,因为它是CodeGear公司的IP,但你可以很容易地做到这一点你自己和再利用零部件的它的代码.


Jer*_*ers 6

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

然而,模态形式有自己的事件循环,阻止原始应用程序事件循环执行.

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

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

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

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

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

--jeroen


Ser*_*yuz 5

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