【问题标题】:How to smartly add a line of code in all the FormCreate events without editing all forms?如何在不编辑所有表单的情况下巧妙地在所有 FormCreate 事件中添加一行代码?
【发布时间】:2018-07-16 08:52:54
【问题描述】:

我需要在我的应用程序的所有形式中调用一个初始化例程,它是一个 Intraweb 应用程序,所以实际上我将使用OnIWAppFormCreate 而不是OnFormCreate,反正问题是一样的。

我想到了两种技巧:

  1. 使用 Visual Form Inheritance:在这种情况下,我创建了一个 BaseForm,我在其中实现了 FormCreate 事件并从中继承所有表单

  2. 我添加了一个全局过程,并从所有表单中调用它

这两种技术都让我可以编辑每个表单。

有没有办法避免这种情况?

实际上我需要做的是将相同的字符串添加到 TIWAppForm.ExtraHeader stringlist 属性中。

这是我需要添加到每个表单的代码:

ExtraHeader.Add('<link rel="stylesheet" type="text/css" href="/css/mycustomcss.css">');

不知何故,我想知道是否有一种方法可以用我不知道的技术只编码一次。

谢谢。

【问题讨论】:

  • 您可以使用拦截器类,但是虽然这不会让您编辑所有表单,但它会让您编辑所有单元以将拦截器类单元添加到使用子句中。根据您的代码的确切结构,这可能是也可能不是问题。
  • 谢谢,我不知道这一点,这肯定是我列表中的第三项,但正如你所说,它并不能让我免于编辑所有表单 不幸的是,应用程序很旧,我做到了当时不使用基本形式来继承,而我在所有最近的应用程序中都这样做,因为它很方便。
  • 事件不是这样做的方法。您需要的是一个基本形式,所有形式都从该基本形式派生而来。然后覆盖该表单的构造函数并将公共代码放在那里。
  • 我会选择基本表单方法,即使它需要触及所有表单,因为它可以在未来重复用于类似目的。
  • 不可以hook T(Custom)Form.Create吗?

标签: delphi delphi-10-seattle


【解决方案1】:

最好的解决方案是从基本表单继承,即使在我几乎所有的表单中,我都编写了 OnFormCreate 代码,以便实现我所做的任务:

  1. 创建一个继承自TIWAppForm的基本表单

  2. 在我从基本形式继承的单元声明中

  3. 在 dfm 中,我将 object 替换为 inherited

  4. 在我明确调用 inherited 的所有表单的 FormCreate 中

【讨论】:

  • 我个人认为这是最好的方法。但作为评论,如果 FormCreate 的事件处理程序在后代表单上没有更改,您可以安全地删除它。只需删除事件处理程序中继承的调用并保存您的表单,该表单应该从后代中删除事件处理程序。由于您不会在后代形式中使用事件处理程序,因此将使用祖先/基本形式上的事件处理程序。但是......在每个后代形式中明确地使用它当然没有错......
  • 这可能是我的偏好,而不是 Delphi 中的规则——也许是因为我不止一次遇到过这种情况的糟糕经历——但我试图避免使用在其实现期间的类型的事件。我的意思是,对于 TIWAppForm 的实现,我不会使用它的事件 OnFormCreate - 我会覆盖虚拟 DoFormCreate - 因为事件可以由这种类型的消费者分配,从而破坏实现细节。
  • 事件是错误的方式。重写构造函数。 -1
  • 您确定您的答案是“不编辑所有表单”吗?您在问题中定义了“编辑表单”,但在答案中,您通过将代码添加到“所有表单”的事件处理程序来做到这一点。如何“不编辑”?您的解决方案与通过表单的所有来源进行的简单“查找和替换”有什么区别? ;) 并且请 - 不要误会我的意思 - 这里的讨论是关于以优雅和方便的方式为所有表单添加代码,而不是“不编辑”。恕我直言,解决方案(针对实际问题)应该使用 RTTI 或类似的东西。
猜你喜欢
  • 2018-08-09
  • 1970-01-01
  • 2016-10-09
  • 2021-10-18
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多