TList 有一个比较麻烦的问题是,到底由谁来释放List中的对象或指针。

本例将释放任务教给 TSimpleList ,方便使用。

如果 TList 为于管理对象,还可以实现 AddNewOne 功能。方便使用。

TSimpleList类应用源码

uSimpleList.pas 源码

  1. unit uSimpleList;
  2.  
  3. interface
  4.  
  5. uses
  6. Generics.Collections;
  7.  
  8. type
  9.  
  10. TSimpleList<T> = class(TList<T>)
  11. private
  12. FCurIndexPos: integer;
  13. function DoPopByIndex(Index: integer): T;
  14. procedure FreeAllItems;
  15. procedure SetCurIndexPos(const Value: integer);
  16. protected
  17. FNeedFreeItem: boolean;
  18. procedure FreeItem(Item: T); virtual; //子类可以重截这个以确定该如何释放
  19. public
  20.  
  21. constructor Create;
  22. destructor Destroy; override;
  23.  
  24. procedure Lock; //新版的Lock功能值得学习
  25. procedure Unlock; //
  26.  
  27. function PopFirst: T; //不解释,下同
  28. function PopLast: T;
  29. function PopByIndex(Index: integer): T;
  30.  
  31. procedure ClearAndFreeAllItems; //清空并释放所有的Item
  32. property CurIndexPos: integer read FCurIndexPos write SetCurIndexPos;
  33.  
  34. end;
  35.  
  36. //加 Constructor 限制是要求 T 要有一个没带参数的Create函数,也就是构造器
  37. TClassSimpleList<T: Class, Constructor> = class(TSimpleList<T>)
  38. protected
  39. procedure FreeItem(Item: T); override;
  40. function AddNewOne: T;// T有了Create 才能写这个
  41. end;
  42.  
  43. implementation
  44.  
  45. procedure TSimpleList<T>.ClearAndFreeAllItems;
  46. begin
  47. FreeAllItems;
  48. clear;
  49. end;
  50.  
  51. constructor TSimpleList<T>.Create;
  52. begin
  53. inherited;
  54. FNeedFreeItem := true;
  55. FCurIndexPos := -;
  56. end;
  57.  
  58. destructor TSimpleList<T>.Destroy;
  59. begin
  60. FreeAllItems;
  61. inherited;
  62. end;
  63.  
  64. function TSimpleList<T>.DoPopByIndex(Index: integer): T;
  65. begin
  66. if (index >= ) and (index <= count - ) then
  67. begin
  68. result := items[index];
  69. Delete(index);
  70. Exit;
  71. end;
  72. result := T(nil);
  73. end;
  74.  
  75. procedure TSimpleList<T>.FreeAllItems;
  76. var
  77. Item: T;
  78. begin
  79. if FNeedFreeItem then
  80. begin
  81. FCurIndexPos := -;
  82. for Item in self do
  83. FreeItem(Item);
  84. end;
  85. end;
  86.  
  87. procedure TSimpleList<T>.FreeItem(Item: T);
  88. begin
  89. // 假设 T 是 PMyRec =^TMyRec TMyRec=record;
  90. // 这个写法对吗?
  91. // if GetTypeKind(T) = tkPointer then
  92. // begin
  93. // Dispose(Pointer(Pointer(@Item)^));
  94. // end;
  95. // 此写法未认真测试所以不使用。
  96. // 如果 Item 是指针,我在继承类中的 FreeItem 中写 Dispose(Item);
  97. end;
  98.  
  99. procedure TSimpleList<T>.Lock;
  100. begin
  101. system.TMonitor.Enter(self);
  102. end;
  103.  
  104. procedure TSimpleList<T>.Unlock;
  105. begin
  106. system.TMonitor.Exit(self);
  107. end;
  108.  
  109. function TSimpleList<T>.PopByIndex(Index: integer): T;
  110. begin
  111. result := DoPopByIndex(index);
  112. end;
  113.  
  114. function TSimpleList<T>.PopFirst: T;
  115. begin
  116. result := DoPopByIndex();
  117. end;
  118.  
  119. function TSimpleList<T>.PopLast: T;
  120. begin
  121. result := DoPopByIndex(count - );
  122. end;
  123.  
  124. procedure TSimpleList<T>.SetCurIndexPos(const Value: integer);
  125. begin
  126. FCurIndexPos := Value;
  127. end;
  128.  
  129. { TThreadClassList<T> }
  130.  
  131. function TClassSimpleList<T>.AddNewOne: T;
  132. begin
  133. result := T.Create();
  134. Add(result);
  135. end;
  136.  
  137. procedure TClassSimpleList<T>.FreeItem(Item: T);
  138. begin
  139. Item.Free;
  140. end;
  141.  
  142. end.

uSimpleList.pas

附:delphi 进阶基础技能说明

Delphi 对泛型TList的的改进(TSimpleList)的更多相关文章

  1. Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>

    Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含 ...

  2. Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较

    转载自:http://www.ylzx8.cn/windows/delphi/73200.html 本人在做一个测试,服务器是IOCP的,我假定最大链接数是50000个. 测试背景:如果每个链接之间的 ...

  3. Delphi容器类之---TList、TStringList、TObjectList,以及一个例程的代码分析

    转载自:http://blog.csdn.net/jqandjq/article/details/5429137 看了这里标题,大家可能以为我会谈TListBox控件,那就错了.我要谈的是Delphi ...

  4. Delphi容器类之---TList、TObjectList、TComponentList、TClassList

    转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类, ...

  5. delphi 线程教学第六节:TList与泛型

    第六节: TList 与泛型   TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...

  6. Delphi泛型动态数组的扩展--转贴

    此文章转载于http://www.raysoftware.cn/?p=278&tdsourcetag=s_pcqq_aiomsg的博客 从Delphi支持泛型的第一天起就有了一种新的动态数组类 ...

  7. delphi一些小技巧 从别处看到

    开发环境--------    Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件.安装好Delphi ...

  8. (转载)Delphi开发经验谈

    Delphi开发经验谈 开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件. ...

  9. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...

随机推荐

  1. ZRender源码分析6:Shape对象详解之路径

    开始 说到这里,就不得不提SVG的路径操作了,因为ZRender完全的模拟了SVG原生的path元素的用法,很是强大. 关于SVG的Path,请看这里: Path (英文版) 或者 [MDN]SVG教 ...

  2. 在Google map图上做标记,并把标记相连接

    <!DOCTYPE html> <html> <head> <title>GeoLocation</title> <meta name ...

  3. PHP面试题之设计模式

    设计模式是技术面试的时候难免会被问到的一个问题,特别会让你举例说明各种设计模式的使用场景. 使用设计模式可以减轻我们的工作量,优化我们的代码. 设计模式非常的多,这里介绍单例模式,工厂模式,组合模式, ...

  4. Laravel中的队列处理

    Laravel中的队列处理 队列介绍 为什么要有消息队?这里先对其进行一个简单的介绍,方便还不了解的同学理解.在面向对象里,有一个很简单的概念--消息传递,而消息队列就可以在它上面扩展一下,把它说的更 ...

  5. 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学、女性课程、高级研修班、心理学、EWP_培训通课程

    复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期) _复旦大学.女性课程.高级研修班.心理学.EWP_培训通课程 复旦大学EWP菁英女性课程(复旦卓越女性课程改版后第一期)    学      ...

  6. Curious Robin Hood(树状数组+线段树)

    1112 - Curious Robin Hood    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 ...

  7. SQL Server中的DATEPART函数的使用

    下面文章来自:http://blog.csdn.net/hello_world_wusu/article/details/4632049 定义和用法 DATEPART() 函数用于返回日期/时间的单独 ...

  8. KVC在定义Model类中的妙用

    @我们应用程序使用MVC架构的话,对于处理数据类,我们会单独的定义Model类,在里面为要展示的属性进行初始化赋值,一般採用的方法是通过定义相应的属性,挨个赋值.如今我要介绍的就是通过KVC,key- ...

  9. 【JavaScript脚本编程技术详解-----(一)】

    首先说明,本系列教程是写给有一定的JavaScript编程基础的同学看的,最好还有其它的编程语言经验,因为里面可能涉及一些其它的程序设计语言写的源代码,这都是我自己总结的经验,我喜欢在学习一门新的编程 ...

  10. 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题

    关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...