Delphi TForm构造函数

时间:2016-09-17 15:18:19

标签: delphi

我已经在stackoverflow上找到了一些东西,但它并没有真正解决我的疑问。我知道创建对象的正确方法是在创建之后将代码包围在try-finally块中。但是怎么样:

procedure TForm3.FormCreate(Sender: TObject);
begin
  a := TClassX.Create;
end;

然后致电:

procedure TForm3.FormDestroy(Sender: TObject);
begin
  a.Free;
end;

a: TClassX;TForm3类中的公开声明。我应该为表单创建构造函数和析构函数,还是可以使用上面的代码?这样安全吗?

2 个答案:

答案 0 :(得分:8)

try / finally是存在的,或者至少是等价的东西。它只存在于代码之外,位于调用堆栈的上方。类似的东西:

Form1 := TForm1.Create(nil);
try
  // do stuff
finally
  Form1.Free;
end;

您的OnCreateOnDestroy处理程序分别从构造函数和析构函数中调用,因此受到保护。

只要每个人遵守规则都没有泄漏。这里的规则是在构造函数中创建并在析构函数中销毁的对象。实际创建对象的人有责任确保无论如何都将其销毁。但这是你班级消费者的任务,而不是你。

答案 1 :(得分:0)

前段时间我遇到过这些事件的一些问题,所以我不建议在你的应用程序中使用 OnCreate / OnDestroy 事件。以下是我记得的一些案例:

  • 默认情况下,VCL处理来自 OnCreate / OnDestroy 事件的异常。实际上,如果a:=TClassX.Create;将生成异常,它将由应用程序异常处理程序显示,但表单将成功创建,保持" a"变量等于零。如果您稍后尝试访问此变量,则可能会导致访问冲突。

  • 根据OldCreateOrder,可以从构造函数/析构函数 AfterConstruction / BeforeDestruction 方法调用这些事件。如果您偶尔在表单后代中更改 OldCreateOrder ,它也可能导致访问冲突

而且,当你使用事件而不是虚函数时,我看起来很奇怪。在大多数情况下,事件用于将功能委托给其他对象(例如,您将表单的方法分配给按钮的OnClick事件)。