Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重写Delphi表单构造函数和使用它是否都有问题;什么是OnCreate事件?_Delphi_Constructor_Oncreate - Fatal编程技术网

重写Delphi表单构造函数和使用它是否都有问题;什么是OnCreate事件?

重写Delphi表单构造函数和使用它是否都有问题;什么是OnCreate事件?,delphi,constructor,oncreate,Delphi,Constructor,Oncreate,Delphi帮助说明要么重写表单的构造函数,要么使用OnCreate事件。但不要两者都做。这是什么原因?我能看到的唯一一件事是,如果继承在子体中的构造函数中被忽略,则不会调用TCustomForm.Create。所以在这种情况下不会调用OnCreate。但是,如果遗传因素没有被排除在外,我看不出有什么问题 编辑:我应该为我的问题添加原因。实际上,我并不打算在同一个课堂上同时使用这两种方法。但我正在考虑重写基类中的构造函数,这时子体已经在使用OnCreate。所以我想知道是否有什么冲突我没有意识到

Delphi帮助说明要么重写表单的构造函数,要么使用OnCreate事件。但不要两者都做。这是什么原因?我能看到的唯一一件事是,如果继承在子体中的构造函数中被忽略,则不会调用TCustomForm.Create。所以在这种情况下不会调用OnCreate。但是,如果遗传因素没有被排除在外,我看不出有什么问题

编辑:我应该为我的问题添加原因。实际上,我并不打算在同一个课堂上同时使用这两种方法。但我正在考虑重写基类中的构造函数,这时子体已经在使用OnCreate。所以我想知道是否有什么冲突我没有意识到。但我觉得应该没问题。虽然我可能只是在基类中使用OnCreate来保持它的一致性

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

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

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

如果有几个地方可以做任何事情的话。只要选择一个并坚持下去。仅在合理的情况下使用其他位置


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

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

只需确保按如下方式编写重写的构造函数:

constructor TMyForm.Create(AOwner: TControl);
begin
  inherited;
  ....
  your new code here
end;
还要注意,在添加的Create代码之前,
OnCreate
处理程序将被调用。这会很快让人困惑,这就是为什么手册建议不要这样做

警告

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

根据TMyForm的使用位置,创建不同的内容应该进入OnCreate处理程序


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

我在必要时使用OnCreate事件-我从不喜欢覆盖TForm的默认构造函数-在以后的某个时候,您将不可避免地遇到复杂和混乱

其他处理方法,如果可能,我更喜欢:

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


有时,在表单单元上使用变量和函数,但在表单类之外使用也是合适的——就像Delphi本身不断做的那样。在使用这种方法时,请考虑使用表单单元的初始化和终结部分——尽管要非常小心,特别是使用COM对象或组件,在这里使用所有者属性进行清理——您可能会遇到关机清理中的AV问题。

很高兴在这里见到您。一定要收集德尔福徽章和大师徽章。嗯,小要点,但它是冲突的,而不是冲突的!无法通过“编辑”更正,因为它只有1个字符。不要忘记要覆盖的后结构。哦,拥有多种初始化方法的乐趣..欢迎用户maxbigint。Stackoverflow确实增长很快。Ritsaert-谢谢你指出这一点。我从来没有注意到这一点。约翰-这似乎是讨论编程的最佳场所。我急于想出一个新名字,我想要一些容易记住的东西。重写VCL构造函数是正常的做法,没有什么可怕的。如果您使用的是继承,那么使用事件会使生活变得艰难。就我个人而言,我从来没有使用OnCreate.FWIW,我从来没有在表单上使用继承,或者就这点而言,我从来没有在表单上使用过继承——接口、对象组合在我看来要灵活得多。