2011-11-04 75 views
5

这是我在这里的第一篇文章,但我想向社区表示感谢,因为我已经找到了解决我的问题的无数次来到这里并找到问题的解决方案这已经得到了回答。delphi虚拟课堂创建/破坏

这就是说,我想说明一下。我正在使用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不再需要时,我将释放实例。我已经完全了解了我的能力,以确保在应用程序关闭前我已经正确释放了任何实例,但显然我错过了一些东西。

那么,有没有人有任何想从这里调试这样的东西?

P.S.再一次,我是新的,所以如果有什么我错过了,掩盖了,或忘了补充,请让我知道。再次感谢您阅读我的文章!

+0

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

回答

2

这可能是Parent在释放过程中释放所有包含的控件。

+1

如果父节点想在应用程序关闭期间销毁它,那么在运行时不再需要的时候,销毁该框架的正确方法是什么,或者是否有告诉父节点的方法,它不需要担心尝试摧毁组件? – PoultrySlave

+4

@PrematureOptimization'TWinControl'释放其子控件,请参阅[这里](http://stackoverflow.com/questions/7075637/)。 –

+0

@TOndrej,谢谢,VCL相当有趣又危险的角落 –