Delphi中的模态形式可以是非阻塞的吗?

Delphi中的模态形式可以是非阻塞的吗?,delphi,delphi-xe,vcl,Delphi,Delphi Xe,Vcl,我希望在Delphi中创建一个模式表单,防止用户界面与之交互,但仍然允许其他表单继续执行。这是可能的吗?表单本身没有“执行”,但当(模式)表单处于活动状态时,您可以使用线程在后台执行代码。通过调用函数调用模式表单,showmodel,该函数仅在模式表单关闭时返回。如果要在同一线程(UI线程)上执行代码,则需要从showmodel内部调用它。在几乎所有情况下,这不是一个站得住脚的方法。由此我们可以得出结论,所讨论的代码必须在UI线程以外的线程中执行。Windows继续在后台处理消息,因此,例如,在

我希望在Delphi中创建一个模式表单,防止用户界面与之交互,但仍然允许其他表单继续执行。这是可能的吗?

表单本身没有“执行”,但当(模式)表单处于活动状态时,您可以使用线程在后台执行代码。

通过调用函数调用模式表单,
showmodel
,该函数仅在模式表单关闭时返回。如果要在同一线程(UI线程)上执行代码,则需要从
showmodel
内部调用它。在几乎所有情况下,这不是一个站得住脚的方法。由此我们可以得出结论,所讨论的代码必须在UI线程以外的线程中执行。

Windows继续在后台处理消息,因此,例如,在计时器上发生的任何更新都将继续发生。只是所有的键盘和鼠标事件都指向模态表单。理论上,如果您愿意,您可以将消息发布到另一个表单以“操作”某些代码。在主线程中还有很多事情可以做,问题是这是否是您真正想要做的。

可能,但不推荐

我这样做是为了显示一个进度表,说明应用程序在主线程上仍然处于繁忙状态

其思想是将代码放入ShowModal中,并将其一分为二,在这样做时删除repeat-until循环

您可以调用前半部分来显示表单,您必须保证调用后半部分来再次关闭表单

类似于

NonBlockingModalForm =  TNonBlockingModalForm.Create();
try
    NonBlockingModalForm.FirstHalfOfShowModal;
    DoStuff;
finally
    NonBlockingModalForm.SecondHalfOfShowModal;
    NonBlockingModalForm.Free;
end;
请注意,在ShowModal内的循环中,有一个对Application.HandleMessage abd的调用,用于检查正在终止的应用程序


如果你想让你的用户界面更好地发挥作用,你就需要这样做。

为什么不把你想要发生的事情从表单中转移到它们所属的其他地方呢?有些人走到MVC,我只是走到没有把我所有的逻辑放在我的表格里。这个问题对我来说并不清楚。我是说,你到底想要什么?用户交互还是代码执行?我认为模态表单的整个设计目的是防止背景与之交互,除非我误解了这个问题?