`

Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏

阅读更多

摘自:http://blog.csdn.net/gogogo/archive/2006/10/09/1327911.aspx

 

Delphi中大家在使用 ListView和TreeView时,一般都会使用到Item的Data属性来保存大家自己的内部数据,这个Data的声明如下:

property Data: Pointer;

大家可以看到它就是一个指针,使用上一般类似如下代码(以ListView为)

添加时

  PViewItemState = ^TViewItemState;
  TViewItemState = record
    ViewItemId: integer;
  end;

var
  nLoop: integer;
  li: TListItem;
  pp: PViewItemState;
begin
  for nLoop := 0 to 10 do
  begin
    li := ListView1.Items.Add;
    li.Caption := IntToStr(nLoop);
    new(pp);
    pp^.ViewItemId := nLoop;
    li.Data := pp;
  end;
end;

删除相应的项时多数采用

  ListView1.DeleteSelected;  或

  ListView1.Clear;

就结束了操作。

但是这里存在非常大的危险,就是我们的自己分配的Data内容有没有释放,Delphi文档中也没有关于这个问题的说明,所以我做了一个测试,发现Delphi是不自动释放这些数据的,这些未释放的数据在一个包含较多修改的ListView或者TreeView中将非常危险,如果是长期运行的系统将更危险,Delphi文档中也没有提示这些数据需要释放

其实这个问题容易被大家忽略,解决办法还是有的,而且也不难,这里就要使用到ListView或者TreeView的OnDeletion事件,Delphi中关于OnDeletion的说明如下:

Occurs when an item in the list view is about to be deleted.

Delphi syntax:

property OnDeletion: TLVDeletedEvent;

C++ syntax:

__property TLVDeletedEvent OnDeletion = {read=FOnDeletion, write=FOnDeletion};

Description

Write an OnDeletion event handler to respond when an item in the list is about to be deleted. The Item parameter is the TListItem object from the Items property that is about to be deleted.

也就是说当需要删除项目时会触发这个事件,在VCL Source 中也可以看到调用过程,其实解决方法就是在这个事件中加入一个语句就可以了,并且是不可以缺少的语句,代码如下:

procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);
begin
  Dispose(Item.Data);
end;

这样就可以安全的释放掉Data的内存了。

分享到:
评论

相关推荐

    DELPHI VCL组件 TTreeList, Listview和Treeview相结合的多列树控件

    `TTreeList`组件是Delphi VCL(Visual Component Library)框架中一个独特且强大的控件,它结合了`ListView`和`TreeView`的功能,允许用户在多列树形结构中展示数据。这篇博客文章深入探讨了这个组件的用法,提供了...

    ListView和Treeview的结合使用

    2. ListView显示文件内容:当选中TreeView中的某个文件夹节点时,ListView会更新为显示该文件夹下的所有文件和子文件夹,用户可以查看文件名、大小、修改日期等信息。 要实现这样的功能,首先需要在GUI设计工具中...

    Listview与Treeview混合

    3. 监听事件:当用户在TreeView中选择一个节点时,需要捕获SelectionChanged或AfterSelect等事件,然后更新ListView,显示该节点对应的详细信息。 4. 交互同步:确保ListView和TreeView之间的操作同步,比如在...

    treeview和listview结合使用的例子

    在C#编程中,`TreeView`和`ListView`控件是Windows Forms开发中常见的两种界面元素,它们分别用于展示层次结构的数据和多列列表数据。本篇将详细讲解这两个控件的基本概念、如何结合使用以及在实际应用中的案例。 #...

    delphi中listview启用checkbox实现单选

    可以通过`ListView1.Items.Add`方法添加新项,并使用`Item.Caption`和`Item.SubItems`属性设置项的文本。例如: ```delphi procedure TForm1.FormCreate(Sender: TObject); begin ListView1.Items.Add.Caption := ...

    DELPHI xe5 ListView例子

    通过这个简单的DELPHI xe5 ListView例子,开发者可以了解如何在移动应用中使用ListView来展示和管理数据。随着对TListView组件的深入了解,你可以创建更加复杂和功能丰富的应用程序,满足用户在iOS等平台上的需求。...

    listview和treeview交互实现

    在Windows应用程序开发中,ListView和TreeView是两种常用的控件,它们用于展示数据并提供用户交互。ListView常用于显示多列、多行的数据列表,而TreeView则用于构建层级结构的导航。本篇将深入探讨如何在C#或VB.NET...

    delphi中ListView拖动图标

    在Delphi编程环境中,ListView控件是一个非常常用且功能丰富的组件,它允许开发者展示一系列的项,每项可以包含文本、图像甚至自定义视图。本文将深入探讨如何在ListView中实现图标拖动功能,这对于创建具有用户交互...

    delphi实现两个listview之间的item拖拽

    通过以上步骤,你可以在Delphi中实现两个ListView之间的Item拖放功能。在实际应用中,可能还需要根据具体需求调整细节,例如检查拖放合法性、更新数据绑定等。这个过程涉及了Windows消息处理、自定义事件和接口编程...

    listview中改变item背景颜色

    默认情况下,ListView的每个Item(列表项)背景色可能并不符合所有开发者的设计需求。谷歌SDK提供的默认样式中,Item的背景颜色可能是黄色,但这可以通过自定义来改变,以满足个性化设计或品牌风格的要求。在本篇...

    delphi listview 行列写操作

    在Delphi编程环境中,ListView控件是用于展示数据的常用组件,它允许用户以列表或表格的形式查看和操作数据。本篇文章将详细讲解如何在ListView中执行行和列的写操作,以及如何利用for循环处理大量数据。 首先,...

    C# ListView和TreeView实现资源管理介面例子

    通过事件处理程序,比如TreeNode的AfterSelect事件和ListView的ItemSelectionChanged事件,我们可以实现这些控件间的联动,确保当用户在TreeView中选择一个节点时,ListView会相应地更新其显示内容。 实现这样的...

    delphi Listview复选框checkbox实现单选的功能

    在Delphi中,ListView控件是经常用于展示数据列表的组件。它提供了多种视图模式,包括报告视图,其中可以包含复选框(Checkbox)来实现用户交互。本示例着重讲解如何在ListView中实现复选框的单选功能。 在Delphi中...

    Delphi XE10.2之控件ListView强大功能

    在Delphi编程环境中,ListView控件是一个非常常用且强大的组件,尤其在数据展示和用户交互方面。本示例聚焦于Delphi XE10.2中的ListView控件,该版本提供了许多增强的功能和优化,使得开发者能够更好地利用这个组件...

    delphi ex10 ListView上拉下拉更新

    综上所述,"delphi ex10 ListView上拉下拉更新"这个示例涵盖了Delphi Android应用中`TListView`的高级使用技巧,包括自定义事件处理和利用平台服务来实现上拉加载更多和下拉刷新功能。这些技术对于创建交互性强、...

    C语言操作ListView和TreeView详细说明(带例子)

    本篇文章将深入探讨如何在C语言中使用ListView和TreeView,并通过具体的例子进行详细说明。 首先,ListView控件主要用于显示列表形式的数据,可以包含单列或多列,每列可以有不同的数据类型,如文本、图标等。操作...

    vb.net开发案例-用listview和treeview开发图像浏览器[参照].pdf

    在Tutorial 3中,作者介绍了如何使用listview和treeview控件来开发一个图像浏览器。该浏览器可以显示图像的缩略图、名称和大小等信息,并可以实现图像的浏览、选择和删除等操作。 在开发图像浏览器时,作者首先介绍...

    VB演示Treeview和ListView相结合的例子.rar

    VB6.0演示Treeview和ListView相结合的例子,在ListView中使用Treeview菜单,将ListView修饰了一下,好像看上去不太像ListView了,但在其中增加了树控视图,实际项目编写中,这种类似的功能还是使用率很高的。

    Delphi演示PopupMenu与ListView各个子项如何关联..rar

    在Delphi编程环境中,PopupMenu和ListView是两种常用的控件,它们在开发用户界面时发挥着重要作用。PopupMenu提供了上下文敏感的菜单,而ListView则用于显示多列数据的列表。将PopupMenu与ListView的各个子项关联...

Global site tag (gtag.js) - Google Analytics