代码之家  ›  专栏  ›  技术社区  ›  awmross

在Delphi中异步打开模式对话框

  •  6
  • awmross  · 技术社区  · 14 年前

    通常,当使用showmodal打开对话框时,当前线程的执行将停止,直到关闭对话框。我想显示一个模式对话框,但在当前线程上继续执行,而对话框仍然处于打开状态。

    “modal”的意思是,在关闭模式对话框之前,用户不能与应用程序的任何其他形式进行交互。

    Delphi ShowModal函数提供了与我需要的“模式”稍有不同的定义:

    模式窗体是在关闭窗体之前应用程序无法继续运行的窗体。

    目前我有这样的代码:

    dialog.Parent:=self;
    dialog.Show;
    // keep doing stuff...
    

    这是可行的,但我仍然可以与父窗口交互(移动它,关闭它等)

    如何显示不使用ShowModal而阻止用户与父窗口交互的窗体?

    3 回复  |  直到 14 年前
        1
  •  6
  •   Eugene Mayevski 'Callback    14 年前

    打开delphi\source\vcl\forms.pas的源代码,打开showmodal的实现。然后学习它是如何工作的。我不能在这里复制源代码,因为它是一个代码设备的IP,但是您可以自己轻松地完成这一任务,并重用部分代码。

        2
  •  6
  •   Jeroen Wiert Pluimers    14 年前

    即使打开模式窗体,主线程仍会执行(否则模式窗体无法重新绘制自身)。

    但是,模式窗体有自己的事件循环,从而阻止了原始应用程序事件循环的执行。

    它们必须(就像Windows消息框也必须那样),否则您可能会让一个事件溜回到主事件循环中,从而创建另一个模式窗体或消息框。

    这种情况否定了模式化的全部意义:每个UI线程只能有一个模式形式或消息框。

    所以你需要问自己这个问题:

    What actions in the main event loop does this modal form prevent from happening?

        3
  •  5
  •   Sertac Akyuz    14 年前

    DisableTaskWindows TCustomForm.ShowModal