Delphi 2007 MDI表单销毁序列问题



我有一个奇怪的问题,我似乎无法解决。我有一个MDI子窗体,上面有一个TListView组件。在这个列表视图中,我添加了一些具有指向相关对象的数据属性的列表项。在OnFormDestroy事件中,我做了类似于以下的事情来清理这些对象:

Procedure TMDIChildForm1.FormDestroy(Sender: TObject);
Begin
For I := 0 To lvLabour.Items.Count - 1 Do
TLabourItem(lvLabour.Items[I].Data).Free;
lvLabour.Items.Clear;
End;

现在,如果我关闭表单本身,但保持应用程序打开,这就可以了。它将遍历每个项目,释放关联的对象。但是,如果我只是完全关闭应用程序而不首先关闭MDI表单,当它到达上面的代码时,项目计数为0。这意味着在调用FormDestroy方法之前已从列表中清除了这些项。

因为只有在应用程序关闭时才会发生这种情况,所以不存在内存泄漏。我只是将应用程序设置为在调试时显示内存泄漏,当我收到内存泄漏消息却不知道原因时,这会让我很恼火。

之所以会发生这种情况,是因为无论出于何种原因,终止过程都会在代码运行之前清除列表视图。但有更好的方法来处理这个问题。好吧,一些更好的诚实方式。

从离您最近的位置开始,您应该使用列表视图的OnDeletion事件来执行项目整理。每当删除列表项时,就会触发此事件。您的事件处理程序将具有以下原型:

procedure ListView1Deletion(Sender: TObject; Item: TListItem);

在此事件处理程序中,对Item.Data中保存的对象调用Free。通过这种方式,无论列表及其项是如何销毁的,都可以确保关联的数据被销毁。

我建议的另一种方法涉及更多的工作。使用虚拟列表视图,而不是使列表项包含对数据的引用。在这种操作模式下,每当列表视图控件需要绘制项目或查询其属性和状态时,它都会调用控件的事件以按需获取信息。这避免了您需要将数据对象的生存期与显示它的GUI的生存期相结合

最新更新