delphi - 如何针对程序的某些(但不是全部)其他窗口创建对话框模式?

标签 delphi modal-dialog delphi-xe2

Possible Duplicate:
How can I make a form that is not disabled when another form is shown modally?

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

如何使模式窗口将焦点从主窗体上夺走,但保持信息窗口始终可用且响应灵敏?

使用最明显的InfoFrame.Create(nil).Show当模态表单显示时,来自主框架的信息窗口将无法使用。

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

如何使信息窗口始终可用,即使在另一个表单的 ShowModal 时也是如此。过程已被调用?

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

最佳答案

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

编辑:如果您不想更改 MainForm 中的任何内容,也不想更改模态表单中的任何内容,则可以将计时器添加到具有该表单的 InfoFrame 中不断地 self 启用:

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

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

Edit2:正如 @DavidHeffernan 所指出的,放置此逻辑的更好位置是在 InfoFrameWM_ENABLE 处理程序中,而不是在计时器中。不过,这个想法仍然是一样的。

关于delphi - 如何针对程序的某些(但不是全部)其他窗口创建对话框模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13140321/

相关文章:

Delphi Pascal - 如何将数据写入大于 2 GB 的文件?

delphi - 有没有一种低开销的方法来使用Delphi Hook 鼠标双击?

Javascript api 在弹出窗口中打开外部页面

delphi - 如何从 Delphi XE2 上的所有源文件中删除未使用的单元?

delphi - 列表索引越界,添加框架delphi

delphi - Delphi 2010-源文件在编辑器中随机变为只读?

ruby-on-rails - 在 Rails 中哪里放置可重用的 HTML 代码?

ajaxStart 事件上的 jQuery 模式对话框

delphi - 声明 Component[x] 类型

德尔福XE2 : Use msbuild to build a project in command line prompt error MSB4067