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的内存了。

转载于:https://www.cnblogs.com/martian6125/archive/2009/07/23/9631264.html

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

  1. android中设置ListView的选中的Item的背景颜色(附源码)

    http://longyi-java.iteye.com/blog/976067 ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了 ...

  2. android中的 listview控件,聊聊Android中的ListView控件

    软硬件环境 Macbook Pro MGX 72 Android Studio 1.3.2 坚果手机 前言 ListView是Android系统中使用非常广泛的一种控件,几乎所有的App都会用到它.它 ...

  3. 利用classloader同一个项目中加载另一个同名的类_线程上下文类加载器ContextClassLoader内存泄漏隐患...

    前提 今天(2020-01-18)在编写Netty相关代码的时候,从Netty源码中的ThreadDeathWatcher和GlobalEventExecutor追溯到两个和线程上下文类加载器Cont ...

  4. listview的item中嵌套多个EditText时的问题

    项目需求:列表展示数据,同时可以修改,保存编辑过的数据(编辑某个数据时背景加深). 问题1:当访问数据库,下载数据后使用adapter展示后,由于item中包含EditText,点击某一个EditTe ...

  5. js中的extend的用法及其JS中substring与substr的区别

    1.    JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...

  6. Java 中发生内存泄漏 5 个场景以及解决方法

    前言 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和 Java 联系起来.在 Java 中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM ...

  7. 【安装配置】安装适用于 Linux 的 Windows 子系统 WSL ,完成 Clion 中对内存泄漏检测工具 Valgrind 的配置,亲测可用

    关键词:[Linux] [WSL] [Clion] [Valfrind] 一.前言 今天在回答一个粉丝的评论(关于C++ delete 和 delete[ ])时,引出上面的系列问题,具体流程如下: ...

  8. 关于listView的item失去焦点不能点击 Item中包含Button 导致抢占焦点

    今天发现一个问题.listView的item点击以后进入到下一个页面,下个页面有个返回按钮,直接返回回去以后点击事件不能触发,滑动或者重新打开这个listView,就可以达到原来的效果.后来发现是因为 ...

  9. (android控件)ListView的Item中设置按钮实现

    前言 在项目的开发过程中,需要Listview的Item中包含按钮的效果.在实际开发过,Item中放置按钮后,ListView 单行选择背景颜色变化的效果没有了. 问题原因 ListView 和 其它 ...

最新文章

  1. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
  2. 世界上第一台电子计算机电子逻辑原件,1、(ID10542分)世界上的第一台电子计算机使用的逻辑元件.doc...
  3. 利用ES6的Generator语法实现自定义iterator
  4. webform计算某几列结果_工业CAE案例实战精选|脱硫吸收塔工艺仿真计算系统
  5. VMware 修复 Fusion 和 Horizon 中的两个提权漏洞
  6. linux建ftp用户限制访问,Linux下建ftp用户并限制用户访问路径
  7. nodejs写的HTTP静态文件的引擎(轻量级)
  8. TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK
  9. 用阿里云商标注册流程步骤,以及有哪些商标延伸服务
  10. python如何创建自定义模块_Python学习之如何引用Python自定义模块?
  11. 用VMware克隆CentOS 6.4后修改HWaddr
  12. unity帧动画事件多次播放
  13. php计算两个地点的距离
  14. 浅谈IC卡密码的破解方法
  15. VMware故障:配置文件(.vmx)损坏修复
  16. 微信支付分开通了,来看看你有多少分
  17. python编码使用ascii编码_Python中的编码问题:ASCII码 Unicoden编码 UTF-8编码
  18. Tcl/Tk--文件操作
  19. 科学计算自由软件SCILAB
  20. UUID太长怎么办?快来试试NanoId(Java版本)

热门文章

  1. 网站SEO优化工作主要包括哪些内容?
  2. oracle 实现HA,oracle RAC的客户端HA配置
  3. 趣谈网络协议笔记-二(第十一讲)
  4. JAVA不可变List的实现
  5. EventBus初解
  6. 矩阵管理——本质是职能分工,例如所有部门都执行财务部门制定的财务制度而不会各自为政...
  7. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
  8. FileChannel
  9. Github 的使用
  10. HTML5学习笔记(二十七):Ajax