6

Delphi 帮助说要么覆盖表单的构造函数,要么使用 OnCreate 事件。但不要两者都做。这是什么原因?我唯一能看到的是,如果继承被遗漏在后代的构造函数之外,则不会调用 TCustomForm.Create。所以在这种情况下不会调用 OnCreate。但是,如果没有遗漏继承,我看不出有什么问题。

编辑:我应该添加我的问题的原因。我实际上并不打算在同一个班级中使用两者。但是当后代已经在使用 OnCreate 时,我正在考虑覆盖基类中的构造函数。所以我想知道是否有某种我不知道的冲突。但我得到的印象应该没问题。虽然我可能只是使用基类中的 OnCreate 来保持它的一致性。

另一个编辑:感谢大家的帮助。所以看起来使用这两种方法实际上不会破坏任何东西,如果你做得正确的话。但是这样做的问题在于它使代码难以理解。我想我应该选择一个最佳答案,但每个人似乎都同意。所以我会选择最先发布的那个。

4

5 回答 5

4

两者都会被调用。这个建议是合理的,因为同时使用这两种方法会让代码的读者感到困惑。

于 2011-04-21T09:53:57.767 回答
3

考虑到您的编辑,两者都使用没有问题。

只要确保你像这样编写重写的构造函数:

constructor TMyForm.Create(AOwner: TControl);
begin
  inherited;
  ....
  your new code here
end;

另请注意,OnCreate处理程序将在您添加的创建代码之前被调用,因此请注意这一点。这可能会很快让人感到困惑,这就是手册建议反对它的原因。

警告

如果您覆盖一个类,请不要使用 OnCreate,因为这可能会阻止 OnCreate 事件的用户对其进行操作,只需在覆盖的构造函数中执行您的操作即可。规则是在 TMyForm 的每个实例的 Create 中需要相同的东西应该进入覆盖构造函数。

根据 TMyForm 的使用位置创建可能不同的东西应该进入 OnCreate 处理程序。

如果与附近的其他组件有任何依赖关系,那么您的代码应始终进入 OnCreate 处理程序。

于 2011-04-21T11:54:27.067 回答
2

您最终可能会在两个不同的地方放置相同或冲突的代码。我自己几乎总是使用 OnCreate 事件。

于 2011-04-21T09:52:13.217 回答
2

如果有几个地方你可以做任何事情。只需选择一个并坚持下去。只有在合理的情况下才使用另一个地方。

主要原因是清晰度。您避免了一些错误,因为您遵循相同的模式。

于 2011-04-21T09:55:56.437 回答
0

我在必要时使用 onCreate 事件——我从不喜欢覆盖 TForm 的默认构造函数——IMO 在某些时候你总是会遇到复杂和混乱。

其他处理方式,我更喜欢在可能的情况下:

向表单添加一个“初始化”方法 - 在创建它之后但显示它之前调用它。这类似于 COM 对象发生的情况 - 构造函数没有参数,您在 Initialize 调用中执行您的业务。

此外,有时在表单单元上但在表单类之外使用变量和函数是合适的——正如 Delphi 本身不断做的那样。结合这种方法,请考虑使用表单单元的初始化和完成部分 - 尽管使用 GREAT CARE,尤其是使用 Owner 属性进行清理的 COM 对象或组件 - 您可能会遇到AV 的关机清理问题。

于 2011-04-22T04:00:55.310 回答