【问题标题】:Modify a Delphi DFM resource to close upon showing?修改 Delphi DFM 资源以在显示时关闭?
【发布时间】:2009-12-15 07:39:31
【问题描述】:

是否可以编辑 DFM(Delphi 的表单脚本格式)以使表单在显示时自行关闭?

我不在 Delphi 中编码,所以我不熟悉这些表单的工作原理,但我似乎可以将代码(但不是标准的 Delphi 代码)放在 OnShow或表单的 OnCreate 事件。但是,在尝试了 CloseExitFormNameExitDestroy 等几个语句后,将无法正常工作(将创建一个日志,说明 OnShow 属性的值无效等错误。)

关闭表单的正常方式是通过按钮,但是按钮没有OnClick事件,只有一个属性,“ModalResult = 1”。

有没有办法让窗口在打开时关闭,我可以在表单的 OnCreate 或 OnShow 事件上放置一些标准函数?或者,也许,在表单本身上创建一个复选框,使 ModalResult = 1? (不知道这样行不行)

感谢您的任何建议!
=)

(注意:可能很明显,但我没有来源。)

【问题讨论】:

  • 请说明为什么要在显示时关闭表单;可能还有其他选择。
  • 因为它很烦人,我总是按同一个按钮。我曾想过编写一个点击按钮的小程序,但我不知道是否可以这样做。

标签: delphi modal-dialog reverse-engineering dfm


【解决方案1】:

不在 DFM 中。您将不得不修改源代码。

【讨论】:

  • 我能做些什么让它完全不显示?如果我删除它的资源,即使更新校验和,程序也会崩溃:/
【解决方案2】:

您看到的 OnShowOnCreate 行仅用于给出已在源代码中定义的方法的名称。您根本无法通过修改 DFM 文件来添加太多功能。

也许表单已经有一个匹配的事件处理程序来关闭它:关闭按钮或菜单项的 OnClick 处理程序,也许?如果是这样,您可以尝试将其设置为 OnShow 或 OnCreate 处理程序。

您也许可以在表单中添加一个 TButton 并设置其 ModalResult ——我不记得您是否真的需要在表单类中为 DFM 中的每个控件添加一个字段——但这只有在表单以模态方式显示,您仍然需要单击它才能关闭表单。

【讨论】:

  • 谢谢,但我可以在 DFM 上添加任何使表单不显示的内容吗?或者,在显示时关闭。关于添加另一个控件,我可以这样做,它适用于复制关闭表单的按钮,我只需复制“ModalResult = 1”,它也适用于关闭表单。我不知道 DFM 中复选框的名称,但“TCheckBox”不起作用。而且该按钮不调用函数,只是具有 ModalResult = 1 的东西 :( 简而言之,我可以在 DFM 中做些什么使它不显示/自动关闭/自动单击/在不存在的监视器上显示/随便什么?
  • 我认为仅通过编辑 DFM 是不可能做到这一点的,抱歉。编写一个将 WM_CLOSE 发送到表单的单独程序可能是您最好的选择。
【解决方案3】:

编辑:在我输入文本墙时看到您添加的一些 cmets 可以澄清一些事情。

我猜您正在使用资源编辑器来编辑 DFM 并修改应用程序的行为,而无需实际接触源代码?

在这种情况下,您可以尝试的最佳方法是将Visible 属性设置为False。但是,如果开发人员“主动在代码中显示表单”,这将没有任何好处。 (他可以通过调用ShowShowModal 甚至通过显式设置Visible 属性来做到这一点。)

不幸的是,如果是这种情况,那么如果不修改实际的源代码,您将无能为力。这是因为 DFM 是在加载表单时处理的;即在显示表单的开发人员代码之前。就算找个地方设置ModalResult也没用,因为调用ShowModal时会清空当前的ModalResult

我不认为我完全理解你想要做什么,因为它没有意义。
在我看来,您希望表单一显示就自动关闭;这没有任何意义。 :S
因此,如果我对您的理解正确,请解释您为什么要这样做;对于您的实际问题,可能会有更好的解决方案。

但是,一些一般概念...

  • 如果要关闭表单,应将其链接到关闭表单的某个操作。在表单上放置一个按钮或一个菜单项。
  • 标准表单有一个标准的 Windows 机制来默认关闭它们。 (即右上角的 X。)
  • 有两种显示表单的方式,显示方式确实会影响其关闭方式。它可以模态显示(这意味着它是应用程序与用户交互的唯一形式),也可以正常显示(允许用户在应用程序的其他形式之间切换)。
    • 以模态方式显示表单的意义在于,它会阻止代码的流动,直到用户完成所需的操作;它通常涉及用户提供某种形式的答案或确认。
    • 当以模态方式显示时,表单应该以ModalResult 关闭。
    • 正常显示时,ModalResult 无效。
  • 每当表单“关闭”时,有几种方法可以完成此操作。
    • 表单可以简单地隐藏;它仍然存在,但不可见。下次要显示该表单时,只需使其再次可见即可。
    • 表格可以被销毁;意味着它不再存在于内存中。如果这样做了,那么下次您要使用该表单时,您必须重新创建它。
    • 可以主动阻止关闭表单的尝试(通常不建议这样做;但在特定情况下可能需要 - 例如,如果表单上的某些信息不正确)。
    • 可以简单地最小化表单(这通常使用 MDI 子表单完成)。
  • 注意:表单上还有许多属性(FormStyle 是最重要的)会影响其行为、显示和关闭方式。 (例如,默认情况下,MDI 子表单将最小化,或者在关闭时不执行任何操作。)
  • 注意:如果应用程序的主窗体正确关闭,则应用程序将关闭。

现在,一些技术细节...

  • 如前所述,表单可以以模态方式显示,也可以正常显示;使用MyForm.Show;ModalResult := MyForm.ShowModal;
    • 注意:如果表单以模态方式显示,则需要检查ModalResult 以找出用户的答案并采取相应措施。
  • 如果您以模态方式显示表单,则应设置ModalResult,表单将自行关闭。一个简单的方法是为表单上的按钮分配一个ModalResult;然后按钮会在点击时自动设置表单的ModalResult
  • 如果您正常显示表单,那么您只需在适当的时间点拨打MyForm.Close注意:注意它们是“关闭”表单的其他方法,但最好使用此方法,因为它允许您处理 OnCloseQuery 事件,这是一种确认表单是否被关闭的机制允许关闭。
  • 注意:关闭表单时,Delphi 可以调用两个事件,您可以处理这些事件来修改表单关闭的行为:
    • 调用OnCloseQuery确认是否允许关闭表单。
    • 调用OnClose 以了解表单应如何关闭(如前所述)。

回到您的问题(听起来您希望表单自动关闭)。而不是自动关闭表单;只是不要费心展示它。这很容易做到。所有表单都有一个Visible 属性;如果设置为True,Delphi会在创建时自动正常显示表单。所以你需要做的就是确保属性是False

【讨论】:

  • 非常感谢您提供如此丰富的信息!我会尝试更好地解释它。有一个关闭表单的按钮,但我想自动化它。它使用“ModalResult = 1”关闭表单,显示对话框时主表单冻结。我尝试了“OnShow = FormName.Close”,但它崩溃并留下一个日志说它是该表单的 OnShow 属性的无效值。设置 Visible = False 不起作用,可能是因为它是模态形式并且必须显示? (但程序运行正常)。有什么我可以放在 FormStyle 上让它不再是模态的吗? (如果这可以实现隐身)
  • 在另一种方法中,是否可以编写等待和关闭模态表单的代码?这样,我可以编写一个与主程序一起启动并按下按钮的小程序。
  • 是的,正如我所解释的:这在 DFM 中是不可能的,因此您必须使用外部程序。可以写一个微不足道的;我建议搜索/发布标记为 Win32 API 的问题以获取一些信息。或者,自动化测试工具能够做这种事情。
  • 谢谢!我认为简单地编写某种自动单击表单的默认按钮可能更聪明。 AFAIK,AutoHotkey 可以做到这一点,甚至可以编译成可执行文件,但我不确定。除非发生什么奇迹,否则你的答案会被选中 =)
  • 选择,顺便说一句,文字墙意味着您愿意提供帮助!另外,它内容丰富且可读性强。谢谢=)
【解决方案4】:

如果没有源代码,您真的无能为力,只能移动文件或更改现有属性。如果您有该程序的 MAP 文件并且存在现有事件(onCreate/OnShow),您可以修补可执行文件以针对这些事件调用不同的代码,但这并不容易,您必须确保您没有不要注入比以前更多的代码或对不存在的例程进行任何外部调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多