我希望在Delphi中创建一个模式窗体,防止用户界面与之交互,但仍允许继续执行其他窗体。这可能吗?
答案 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能够很好地发挥作用,则需要执行这些操作。