【问题标题】:Virtual class creation/destruction in delphidelphi中的虚拟类创建/销毁
【发布时间】:2011-12-22 01:47:07
【问题描述】:

这是我在这里的第一篇文章,但我想对社区说声谢谢,因为我无数次来到这里并在已经回答的问题中找到解决方案,从而找到了解决问题的方法。

话虽如此,我想进入正题。我在 Code Gear 的 Delphi 2007 IDE 工作。我对在 delphi 工作还很陌生,准确地说还不到 3 个月,所以请记住这一点,因为我可能在这里遗漏了一些基本的东西。

首先,我想介绍一下这个问题的背景。我正在编写一个调度实用程序来在特定时间执行任务。对于每个可用任务,有 2 个与该任务相关联的相关 delphi 框架。第一帧用于编辑特定于该任务的详细信息,第二帧用于在任务运行时显示运行时信息。

保存运行任务列表,并在实用程序的滚动框中,显示运行时信息的相应帧列表。这些运行时框架在任务开始和结束时被创建和销毁。这让我想到了我的问题。

我使用虚拟类管理器来保存每个任务的可用显示和编辑框架列表,并根据需要动态创建它们。在运行时,一切都正常运行,当应用程序实际关闭时,我发现了问题。

程序在关闭时发出 EAccessViolation 异常。当我尝试使用 IDE 追踪问题时,与问题对应的行或操作实际上并不存在于我的代码中。所以它必须是在后台执行的一些清理功能的一部分。

我已将其范围缩小到动态创建虚拟类框架的代码,因为当我注释掉该代码时它会正常关闭。所以这让我相信我没有执行一些与使用这种类型的类创建相关的操作。

var
  tmpCCI: TComponentClassInfExt;
  tmpS: String;
  tc: TComponent;
  bf: TBaseactionedit;
...
begin
...
tc := tmpCCI.fComponentClass.Create(nil);
if tc is TBaseactionedit then
begin
  bf := TBaseActionEdit(tc);
  bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount);
  bf.Visible := False;
  bf.parent := pnlActionEdit;
  bf.Align := alClient;
  bf.Visible := True;
end;
...

这是我如何使用虚拟类管理器创建框架的摘录。当不再需要它们时,我正在使用 FreeAndNil 释放实例。我已经尽我所能确保在应用程序关闭之前我已经正确释放了任何实例,但显然我遗漏了一些东西。

那么有没有人知道从哪里来调试这样的东西?

附:再次,我是新人,所以如果有什么我遗漏、掩饰或忘记添加的内容,请告诉我。再次感谢您阅读我的帖子!

【问题讨论】:

  • 如果您让Owner 层次结构在关闭时破坏所有内容,我在关闭时体验过 AV。尝试在关闭时在您的主表单(以及您可能打开的其他表单)上调用Free。通过在 Application.Run 行之后添加到 .dpr 文件来做到这一点。

标签: delphi class virtual creation object-destruction


【解决方案1】:

可能是 Parent 在 Destroy 期间释放了所有包含的控件。

【讨论】:

  • 如果父级想在应用程序关闭期间销毁它,那么在运行时不再需要它时销毁框架的正确方法是什么,或者有没有办法告诉父级,它没有不需要担心试图破坏组件?
  • @PrematureOptimization TWinControl 也释放了它的子控件,参见here
  • @TOndrej,谢谢,VCL 非常有趣和危险的角落
猜你喜欢
  • 2013-09-26
  • 2015-02-26
  • 2015-07-26
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多