Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
来源:互联网 发布:js获取当前div的高度 编辑:程序博客网 时间:2024/05/20 23:06
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中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
- Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
- TreeView的Data的内存泄漏问题
- Qt中如何自定义ListView/TreeView单个item的显示和响应
- delphi中Treeview的使用介绍
- delphi中Treeview的使用介绍
- Android实战技巧之三十八:Handler使用中可能引发的内存泄漏
- Android实战技巧之三十八:Handler使用中可能引发的内存泄漏
- Flex开发中可能出现内存泄漏的地方
- [转]Flex开发中可能出现内存泄漏的…
- ListView中item点事件和item中的控件点击事件冲突的简易解决方法
- 那些由NSTimer 和performSelector 可能引起的内存泄漏
- 被忽略的jQuery中data()函数
- ListView中使用带Edittext的item
- 可能忽略的Java基础知识-小心使用synchronized和volatile
- delphi TREEVIEW的简单使用
- delphi TREEVIEW的简单使用
- 可能你不知道的内存泄漏
- newxy标签实现部门管理、用户权限管理
- JDK1.5 新特性
- Pocket PC常用程序代码(JPEG,串口,ADOCE还有网络的等等)
- JSP全能管理系统1.0-update08.1.10
- USACO The Castle Eventually Accepted
- Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏
- 开张
- 呜呼哀哉,哀哉呜呼[By tina]
- 跨数据库引擎、数据库查询
- 就想说说
- J.J的學習筆錄之C語言部分——數組(二)
- 别的不多说先,先记下遇到的问题:如何在子线程中操作窗体上的控件
- 解读诺贝尔经济学奖成果:澄清可能的分配冲突
- 项目的背后[By tina]