【问题标题】:Is there a property that tells if a form is deactivated by other form `ShowModal` procedure?是否有一个属性可以告诉表单是否被其他表单“ShowModal”程序停用?
【发布时间】:2014-07-24 13:12:50
【问题描述】:

是否有一个属性可以判断一个表单是否被其他表单ShowModal 程序停用?

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

【问题讨论】:

  • 主表单中的某些内容会打开该模式对话框,不是吗?因为如果是这样,请从那里禁用这些东西。
  • 我对你在这里的措辞感到困惑。当您在另一个窗体上调用 ShowModal 时,该窗体会自动禁用。然后您在该表单上说“我想禁用某些操作”。怎么回事?它会发出哔哔声,表示它已禁用并且无法获得焦点。如果您不想禁用表单,请调用 Show 而不是 ShowModal 并在用户单击表单而另一个可见时实现您想要的任何逻辑。
  • 你要求一个属性,但你的描述听起来像你想要一个通知。是哪个?
  • 我的程序有一个托盘图标,当它被点击时,它会显示在主窗体的前面。当另一个窗口以模式状态显示时,我想禁用它。因为不这样做,主表单(禁用)将覆盖模态表单并完全阻止我的程序。
  • @marus - 感谢您提供信息。我发布了一个我认为适合这种情况的答案。

标签: forms delphi delphi-6


【解决方案1】:

这种行为是意料之中的。当显示模式表单时,其他表单将被禁用。您根本不需要禁用任何东西,框架已经为您处理了这一切。发出哔哔声是因为您正在尝试与禁用的表单进行交互。

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

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


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

【讨论】:

  • 是的! IsWindowEnabled 正是我想要的。我很抱歉造成混乱。我不太会说英语,解释对我来说更难。
  • 我猜测真正的问题是什么。一些代码会帮助我们。我想知道真正的解决方案是不是完全不用担心启用并调用Application.BringToFront而不是MainForm.BringToFront
  • > IsWindowEnabled ... > 是的,表单永远不会被禁用,只有窗口会被禁用。
  • @Sertac 有区别很奇怪。我希望对于一个孩子,例如TButton、Enabled 和 IsWindowEnabled 是等价的。
【解决方案2】:

您可以随时测试Application.ModalLevel 以了解是否存在模态表单。例如:

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

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

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

【讨论】:

  • 很遗憾,ModalLevel 已在后面添加。
  • @TLama - 太糟糕了!谢谢你告诉我。
  • 确实如此。我的TApplication 中没有ModalLevel,我使用的是Delphi 6。但是你给我一个关于我应该做什么的想法。我将自己创建该属性,并且每次在调用 ShowModal 之前,我都会将其设置为 true,当 ShowModal 退出时,我会将其设置为 false。
  • 这不是处理问题评论中描述的场景的方法。
  • @David - 你错了(答案中的解决方案)。显示另一个表单模式不会禁用不可见的窗口。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多