【问题标题】:is there a standard non-modal message dialog?是否有标准的非模态消息对话框?
【发布时间】:2014-07-01 22:11:24
【问题描述】:

我想在 PC 上显示可能无人参与的消息。用户回来时可以阅读消息。

我的应用程序必须继续执行,所以我需要一些非模态的东西。在我开始编写代码和创建新表单之前,我想问一下是否有类似“ShowMessage”之类的非模态的。


[更新] 感谢您迄今为止的反馈。我确实知道如何使用表单来完成,我只是想知道是否有一些事情会涉及我编写更少的代码。似乎没有。我将搜索 VCL 组件站点,看看是否有人已经反转了这个特定的轮子。

看来我的问题的简短回答是“否”。

【问题讨论】:

  • 您似乎正在尝试这样做,以避免任何事情阻止您的应用程序响应。虽然这是可能的,但这通常是您需要考虑实现至少一个后台线程来执行您需要的任何处理并与您的表单安全交互的地方,例如使用同步事件或消息泵。
  • 我只是想给用户留下一种“当你离开时......”的通知并继续运行。
  • 我没有-1,但这种类型的窗口甚至不应该首先被认为是模态的。你应该在你的问题中澄清你在这个对话框中究竟显示了什么,因为它听起来根本不应该是一个对话框,而只是另一种形式。
  • @Jerry 这个问题是关于非模态对话框的
  • 回答堆栈上的弹出窗口:stackoverflow.com/questions/2105010/…

标签: delphi


【解决方案1】:

据我所知 - 答案是“不”。

这种非模态消息框没有太多用处,因为确实,消息框意味着程序无法在没有得到用户反馈(是/否/Ok/Cancel)或验证用户阅读它(Ok)的情况下继续。

在不知道其他细节的情况下,我猜你需要一个日志,而不是一堆未处理的消息框。最坏的情况,如果 LAN 发生故障,您预计会堆积多少这样的消息,或者类似的情况,5、20、1000?

创建另一个包含TMemo 的表单,当您的程序需要报告某些内容时 - 显示该表单并将字符串添加到该备忘录。因此,当用户返回时,他会看到该日志。

制作带有TMemoTLabel 的自定义TForm 和公共procedure AppendLog(aMsg: string); 只需10 分钟,比您在搜索上花费的时间要短得多,而且绝对更适合您的使用场景.

【讨论】:

  • 正确的方式,但我不会使用备忘录,因为用户可能会选择“接受”某些备忘录。类似于在单个窗口中报告 Microsoft Outlook 提醒的方式。我们几乎不知道这里会实际显示什么类型的消息。
  • @JerryDodge:“接受”某些“请解释一下。我的意思是,Mawg 可以按照他需要的方式设计这种形式,毕竟,他想要一个单独的 MessageBox 作为开始。使用自定义表单,他可以让它像无边框的 TMemo 一样简单,或者使用功能齐全的 Grid-Tree-ScrollBox。
  • 如果您曾经使用 Outlook 来跟踪日历提醒,则有一个通用窗口,当至少有一个或多个提醒时,该窗口仅显示一次,并且列出的每个提醒都可以关闭或暂停在给定的时间段内,它再次出现。这个问题并没有说明是否是这种情况,它只是说一个非模态对话框来显示“当你离开时”消息。
  • 我支持这个答案。我使用一个自定义日志表单类来处理网格中的消息,并显示有关正在运行的后台操作的统计信息。但是你可以将任何类型的组件和 UI 放在这种类型的表单上,这并不是一个复杂的解决方案。
【解决方案2】:

对于仅向用户显示通知消息而不中断应用程序工作流,您应该使用 Windows Balloon Tips。这些是在系统托盘上方弹出的气球状消息。 用 Delphi 展示它们的最简单方法是使用 TTrayIcon (如果我没记错的话,可以从 Delphi XE 开始使用) http://docwiki.embarcadero.com/CodeExamples/XE5/en/TTrayIcon_(Delphi) http://docwiki.embarcadero.com/Libraries/XE5/en/Vcl.ExtCtrls.TTrayIcon

气球提示的默认行为是当用户离开 PC 时它们保持可见,并且仅在用户活动后隐藏一段时间。因此,这几乎可以保证用户将看到该消息。 您可以设置此气球提示可见的时间。 您可以创建一个自定义事件,当用户单击气球提示时将触发该事件(例如,向用户提供一些选择)。 Balloon Tips 的另一个优点是,当您使用游戏、电影播放器​​等任何全屏应用程序时,它们不会弹出。只要您离开这些应用程序的全屏模式,它们就会弹出。

【讨论】:

    【解决方案3】:

    看看单元Vcl.Dialogs中的函数CreateMessageDialog。这将返回一个标准的 VCL MessageDialog 表单,您可以在必要时对其进行操作,然后按照您的意愿以模态或正常方式显示。

    【讨论】:

    • 请注意,如果您不显示“模态”任何表单,则该表单中按钮的模态结果将无效。 IOW,如果您不显示模式,则无法通过单击其按钮关闭CreateMessageDialog 返回的表单。
    • 正确,但您可以将处理程序附加到关闭对话框并设置“模态”结果的按钮。
    • 另外,如果您显示非模态,您应该考虑添加一个 TCloseEvent 处理程序,以便在关闭时将 CloseAction 设置为 caFree。
    【解决方案4】:

    您应该查看 JVCL 中的 JvDesktopAlert。它提供了与 TTrayIcon BallonHint 类似的功能,但更具可配置性并且可以显示多个(堆叠的)窗口。至少早在 Delphi 7 就支持它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多