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

时间:2012-05-10 10:36:47

标签: delphi delphi-xe vcl

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

4 个答案:

答案 0 :(得分:3)

通过调用函数ShowModal来调用模态形式,该函数仅在模态形式关闭时返回。如果要在同一个线程(UI线程)上执行代码,则需要从ShowModal内部调用它。在几乎所有情况下,这都不是一个成熟的方法。从中可以得出结论,有问题的代码必须在UI线程以外的线程中执行。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

可能,虽然不推荐。

我这样做是为了显示一个进度表单,说明应用程序正在忙着继续主线程。

我的想法是将代码放在ShowModal中并将其拆分为一半,然后删除重复直到循环。

你可以打电话给上半场以显示表格,你必须保证打电话给下半场才能再次关闭。

的内容
NonBlockingModalForm =  TNonBlockingModalForm.Create();
try
    NonBlockingModalForm.FirstHalfOfShowModal;
    DoStuff;
finally
    NonBlockingModalForm.SecondHalfOfShowModal;
    NonBlockingModalForm.Free;
end;

请注意,在ShowModal的循环中,调用Application.HandleMessage abd检查应用程序是否被终止。

如果您希望自己的UI能够很好地发挥作用,则需要执行这些操作。