是否有一个属性告诉表单是否被其他形式的“ShowModal”程序停用?

时间:2014-07-24 13:12:50

标签: forms delphi delphi-6

是否有一个属性可以告诉表单是否已被其他格式的ShowModal程序停用?

编辑: 我的程序有一个托盘图标,当它被点击时会将主窗体带到前面。我希望在另一个窗口以模态状态显示时禁用此功能。因为不这样做主要形式(禁用)将覆盖模态形式并完全阻止我的程序。

2 个答案:

答案 0 :(得分:2)

这种行为是可以预期的。显示模式窗体时,其他窗体将被禁用。您根本不需要禁用任何内容,框架已经为您处理了所有内容。发出哔哔声是因为您正在尝试与禁用的表单进行交互。

如果您希望在窗口被禁用时收到通知,无论出于何种原因,不仅仅是因为已显示模式表单,请收听WM_ENABLE消息。测试您的主表单是否已被禁用。通过调用IsWindowEnabled Win32函数来做到这一点。

话虽如此,我觉得你很可能没有正确诊断出这个问题。听起来你可能会遇到窗口所有权问题,这在Delphi 6中很常见。或者你可能试图从通知图标代码中错误地恢复应用程序。请使用Application.BringToFront


VCL对模态对话框的处理似乎非常混乱。当您显示系统提供的模态对话框时,例如MessageBox,无论窗口是否可见,都会被禁用。但是,VCL仅在调用ShowModal时禁用可见窗口。除此之外,你不能使用Enabled来测试窗口是否被禁用,你必须使用IsWindowEnabled Win32功能。

答案 1 :(得分:1)

您可以随时测试Application.ModalLevel以查明是否有模态表单。 E.g:

if Application.ModalLevel = 0 then
  MainForm.Visible := True;

请注意,非TCustomForm后代不会设置模态级别,API对话框,例如文件打开对话框或MessageBox。如果有可能出现这种情况,您可以使用ModalStartedModalFinished包围运行这些对话框的代码。

在您的情况下似乎没有必要,但如果您以某种方式需要通知表单/对话框是模态的,您可以将处理程序附加到Application.OnModalBeginApplication.OnModalEnd事件。您可以使用TApplicationEvents组件。