1

可能重复:
当另一个表单以模态方式显示时,如何制作未禁用的表单?

假设我有一个包含三个表单的应用程序:一个引导用户完成工作流、向导风格的主表单;在向导的某些步骤中偶尔显示的模式窗口;第三个“信息”窗口可以随时显示,与用户在工作流程中的位置无关。

如何使模态窗口从主窗体中获取焦点,但始终保持信息窗口可用和响应?

InfoFrame.Create(nil).Show当模态表单显示时,使用主框架中最明显的信息窗口会导致信息窗口不可用。

奇怪的是,如果我从模态窗口创建并显示信息窗口,它将以所需的方式响应,并且在模态窗口被关闭后仍然存在。但是,当模态窗口再次显示时,信息窗口将被迫进入背景并变得无响应。

ShowModal即使调用了另一个表单的过程,如何使信息窗口始终可用?

在我正在处理的实际应用程序中,实际上有来自大约十几个“工作流程”主窗口(其中许多也是模态)的数十个模态表单,但只有一个信息窗口(其中可能显示多个实例),我宁愿不必将对 ShowModal 的每次调用都更改为其他内容,尽管如果这是唯一的选择,我不反对包装或子类化调用。

4

1 回答 1

4

不要使用ShowModal,而是禁用MainFormusingEnableWindow(MainForm.Handle, False)并在之后再次启用它 using EnableWindow(MainForm.Handle, True)。您可能需要添加一些内容以确保正确的窗口始终位于顶部。

编辑:如果您不想更改MainForm或 modal 表单中的任何内容,您可以添加一个 Timer 到该InfoFrame表单不断启用自身:

procedure TInfoFrame.EnablerTimer(Sender: TObject);
begin
  if not IsWindowEnabled(Self.Handle) then
    EnableWindow(Self.Handle, True);
end;

这样,InfoFrame即使在调用ShowModal另一种形式后也可以使用。

Edit2:正如@DavidHeffernan 所指出的,而不是在计时器中,放置此逻辑的更好位置是WM_ENABLEInfoFrame. 不过,这个想法保持不变。

于 2012-10-30T14:51:27.050 回答