在delphi中创建/销毁虚拟类

时间:2011-11-04 14:17:21

标签: delphi class virtual creation object-destruction

这是我在这里发表的第一篇文章,但我要感谢社区,因为我已经无数次地找到解决问题的方法来到这里并在已经回答的问题中找到解决方案。 / p>

话虽如此,我想谈谈这一点。我在Code Gear的Delphi 2007 IDE中工作。我仍然很擅长在德尔福工作,准确地说还不到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时,我可以释放它们。我已尽最大努力确保在应用程序关闭之前我已正确释放任何实例,但显然我遗漏了一些东西。

那么有没有人对从这里调试这样的东西有什么想法?

P.S。再一次,我是新人,所以如果有任何我错过的,掩饰,或忘记添加,请告诉我。再次感谢您阅读我的帖子!

1 个答案:

答案 0 :(得分:2)

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