繁体   English   中英

Delphi TForm构造函数

[英]Delphi TForm constructor

我已经在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类内的公共声明。 我应该为表单创建构造函数和析构函数,还是可以使用上面的代码? 安全吗?

尝试/最后在那儿,或者至少是等效的东西。 它只是存在于您的代码之外,在调用堆栈中更高。 就像是:

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

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

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

不久前,我在此事件上遇到了一些问题,因此不建议在您的应用程序中使用OnCreate / OnDestroy事件。 我只记得以下几种情况:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM