【问题标题】:Can a modal form in Delphi be non-blocking? [closed]Delphi中的模态形式可以是非阻塞的吗? [关闭]
【发布时间】:2012-05-10 10:36:47
【问题描述】:

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

【问题讨论】:

  • 你为什么不把你想要发生的事情从表格中移到它们所属的其他地方呢?有些人会使用 MVC,而我只是不会将所有逻辑都放入表单中。
  • 这个问题我不清楚。我的意思是,你真正想要什么?用户交互还是代码执行?
  • 我认为 Modal 表单的整个设计目的是防止与背景交互,除非我误解了问题?

标签: delphi delphi-xe vcl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        可能,但不推荐。

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

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

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

        类似的东西

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-14
          • 1970-01-01
          • 2013-02-10
          • 2014-02-17
          • 1970-01-01
          相关资源
          最近更新 更多