首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi TForm构造函数

Delphi TForm构造函数
EN

Stack Overflow用户
提问于 2016-09-17 15:18:18
回答 2查看 495关注 0票数 1

我已经在堆叠溢出中找到了一些东西,但它并没有真正解决我的疑虑。我知道创建对象的正确方法是,在创建之后,将代码包围在一个try- code块中。但是,关于:

代码语言:javascript
复制
procedure TForm3.FormCreate(Sender: TObject);
begin
  a := TClassX.Create;
end;

然后打电话:

代码语言:javascript
复制
procedure TForm3.FormDestroy(Sender: TObject);
begin
  a.Free;
end;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-17 16:28:51

尝试/最终在那里,或者至少有类似的东西。它只存在于您的代码之外,在调用堆栈的更高的位置。类似于:

代码语言:javascript
复制
Form1 := TForm1.Create(nil);
try
  // do stuff
finally
  Form1.Free;
end;

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

只要每个人都遵守规则,任何事情都不会泄露。这里的规则是在构造函数中创建并在析构函数中销毁的对象。不管是谁实际创造了这个物体,他都有责任确保它无论如何都被摧毁。但这是你这个阶层的消费者的任务,而不是你。

票数 8
EN

Stack Overflow用户

发布于 2016-09-21 02:55:24

不久前,我对这个事件有一些问题,所以我不建议在您的应用程序中使用OnCreate/OnDestroy事件。以下是一些我记得的案例:

  • 默认情况下,VCL处理OnCreate/OnDestroy事件的异常。实际上,如果a:=TClassX.Create;将生成一个异常,它将由应用程序异常处理程序显示,但该表单将成功地保持“一个”变量等于零。如果以后尝试访问此变量,这可能会导致访问冲突。
  • 依赖于OldCreateOrder,这些事件可以从构造函数/析构函数调用,也可以从AfterConstruction/BeforeDestruction方法调用。如果偶尔更改表单后代中的OldCreateOrder,也可能导致访问冲突。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39548434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档