2

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

4

4 回答 4

3

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

于 2012-05-10T14:46:17.060 回答
3

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

于 2012-05-10T11:27:35.503 回答
2

可能,虽然不推荐。

我这样做是为了显示一个进度表,说明应用程序很忙,同时仍在主线程上继续。

这个想法是把 ShowModal 中的代码分成两半,在你这样做的时候删除重复直到循环。

您可以调用前半部分来显示表格,并且您必须保证调用后半部分以再次关闭它。

类似的东西

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

请注意,在 ShowModal 的循环中,有一个对 Application.HandleMessage 的调用,用于检查正在终止的应用程序。

如果你想让你的 UI 玩得很好,你就需要这样做。

于 2012-05-11T08:15:48.200 回答
2

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

于 2012-05-10T10:46:11.100 回答