0

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

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

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

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

感谢您的任何建议!
=)

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

4

4 回答 4

2

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

于 2009-12-15T08:06:44.947 回答
2

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

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

您可能能够将 TButton 添加到表单并设置其 ModalResult - 我不记得您是否真的需要 DFM 中的每个控件的表单类中的字段 - 但这只有在显示表单时才有效模态地,您仍然必须单击它才能关闭表单。

于 2009-12-15T08:09:04.193 回答
1

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

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

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

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

我不认为我完全理解你想要做什么,因为它没有意义。
在我看来,您希望表单一显示就自动关闭;这没有任何意义。: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.

于 2009-12-15T09:06:40.870 回答
0

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

于 2009-12-15T23:20:10.847 回答