Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
【标  题】:Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
【关键字】:Delphi,ListView,TreeView,Item,Data
【来  源】:http://blog.csdn.net/gogogo/archive/2006/10/09/1327911.aspx

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

Your Ad Here

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

NickLee.Framework.2.0.0.3.Pro:【上一篇】
Beyond Single Language —— 有感Beginning C# Object中文版:【下一篇】
【相关文章】
  • 《Effective C#》Item 18:Dispose函数的标准实现模式
  • MS C++ 2005 express database mismatch error when compiling
  • 自定义DataGrid控件开源
  • 初学java总结一下它与其它一些语言(c#,delphi)的差别.
  • 关于窗口重绘的初级问题&由UpdateData(FALSE)想到的窗口刷新问题
  • 《Effective C#》Item 15:利用using和try-finally来释放资源
  • 《Effective C#》Item 16:尽量减少垃圾产生的数量
  • 《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作
  • Visual C# 2005 - 如何于DataGridView控件中以跨数据行方式显示数据
  • 使用DatabaseMetaData和ResultSetMetaData查看数据库信息
  • 【随机文章】
  • 域名专题 - 微软是这么说的!!
  • apache用户验证与虚拟主机包括整合tomcat的虚拟主机
  • 使用 pwd 来判定你的当前目录
  • 如何诊断系统负载过高
  • JavaScript学习(八)
  • Hook钩子攻略
  • 用regsvr32命令注册DLL文件(解决IE遇到问题需要关闭)
  • C#中动态创建控件及事件处理程序
  • SQL查询语句精华使用简要介绍
  • efficiency of NumPy and C-extension
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.