Tlist

Tlist (Classes.pas)

在我刚开始接触TList的时候,TList搞得我迷雾重重,都是Capacity属性惹的祸。我查了Delphi的帮助,它说Capacity是TList的最大容量,又在什么地方说

MaxInt div 4是TList的最大容量。最后我搞明白了,Capacity是临时的,MaxInt div 4才是真正的最大容量。只要你的内存受得了就行,算起来一共是4G。

在TList 内部有一个FList指针指向一个Pointer数组,Capacity就是这个数组的大小。奇怪的是Capacity是可写的。我当时就在想,如果一直使用Add 直到超出了

Capacity的范围,会怎么样呢?为了解决这个问题,我特地打开了TList 的代码,结果发现如下几行(注释是我自己加的):

function TList.Add(Item: Pointer): Integer;

begin

Result := FCount; { 返回Item 所在的位置}

{ 如果FList 数祖被填满了装不下新的Item,那么TList 自动增加Capacity(也就是自动增加FList 指向的数组的大小)}

if Result = FCapacity then

Grow;

{ 扩大了FList 的大小后,就能把Item放进数组了}

FList^[Result] := Item;

Inc(FCount);

if Item <> nil then

Notify(Item, lnAdded);

{给TList 一个信号,通知TList 已经加上了一个新的Item }

end;

procedure TList.Grow;

var

Delta: Integer;

begin

{增加的规则是,如果数量小于或等于8,那么增加4 ;如果数量在8 之上,小于或等于64 ,那么增加16 ;如果数量比64还大,那么一次增加大约1/4 的空间}

if FCapacity > 64 then

Delta := FCapacity div 4

else

if FCapacity > 8 then

Delta := 16

else

Delta := 4; { 改变数组大小}

SetCapacity(FCapacity + Delta);

end;

既然Capacity会自动增加,那么还要Capacity干什么呢?还不如使用链表。不过我后来意识到,在使用链表的时候,取得某个位置的指针比数组困难,

要用比较费时间的循环。TList刚好解决了这个问题。我们既可以把TList 当成数组,也可以把它当成链表。

TList 除了保存的对象是指针以外,其它地方都与TstringList很像。所以接下来我只介绍二者不同之处。

我们同样可以使用TList或者TList.Items获得某一位置的指针如果嫌TList.Items是属性没有效率的话,这里还有一个List属性,指向内部的FList,可以这么用:

TList.List^。

TList提供了First和Last两个属性,分别返回第一个和最后一个指针。

TList 也提供了一个Remove方法。与Delete不同的是,Delete删除的是已知位置的指针,

Remove删除的是已知指针。只要TList 包含有你想删除的指针,就可以使用Remove(Pointer)。

Remove的返回值是指针在还没有被删除之前的位置。使用方法如下:

procedure Delete(Index: Integer);

function Remove(Item: Pointer): Integer;

TList还有一个Pack方法。它能够把所有不是nil的指针聚在一起,同时把Count 的值改变,

这样,所有没用的指针就会被删除,但是并不会减少Capacity。如果你想把没用的空间都释放掉的话,可以把Capacity

设置成Count。

最后,我想说的是Protected里的Notify。大家在Add的代码里就能看到,在Insert、Delete之类的代码里我们也能看得到Notify的踪迹。既然FList

的内容已经被改变了,Notify 还要做什么工作呢?看一下Notify的代码:学习笔记

TListNotification = (lnAdded, lnExtracted, lnDeleted);

procedure TList.Notify(Ptr: Pointer; Action: TListNotification);

begin

end;

留着一个空的Notify

有什么用呢?再看它的声明:

procedure Notify(Ptr: Pointer; Action: TListNotification);

virtual;

原来Notify 是一个虚函数,当我们因为有特殊要求而继承TList类的话,只要TList

的内容一改变,我们就能得到通知。不过前提是我们要覆盖N o t i f y 这个Procedure。

时间: 2024-09-18 22:41:11

Tlist的相关文章

Delphi中Tlist实例

http://blog.163.com/[email protected]/blog/static/74728469201132721428194/ Delphi中Tlist实例 2011-04-27 14:14:28|  分类: Delphi学习 |  标签:list  frmred  tform  frmblue  frmgreen  |举报|字号 订阅 下载LOFTER我的照片书  | unit Unit1; interface uses  Windows, Messages, SysUt

Delphi容器类之---TList、TObjectList、TComponentList、TClassList的使用

转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类,全部都是基于标准的TList类. TList TList类实际上就是一个可以存储指针的容器类,提供了一系列的方法和属性来增加.删除.重排.定位.存取和排序容器中的类,它是基于数组的机制来实现的容器,比较类似于C++中的Vector和Java中的ArrayList. TList经常用来保存一组对象列表

Delphi小谈之TList

转载自:http://blog.csdn.net/jqandjq/article/details/5429137 在我刚接触TList的时候,TList搞得我迷雾重重,都是Capacity属性惹的祸.我查了Delphi的帮助,它说Capacity是Tlist的最大容量,又在什么地方说MaxInt div 4是TList的最大容量.最后我搞明白了,Capacity是临时的,MaxInt div 4 才是真正的最大容量.只要你的内存受得了就行,算起来一共是4G. 在TList内部有一个FList指针

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

第六节: TList 与泛型 TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本): FooList.Zip unit uFooList; interface uses   Generics.Collections; type   TFooList <T>= class(TList<T>)   private     procedure FreeAllItems;   

delphi 结构体和TList的用法

type  PRecord = ^TMyRec;  TMyRec = record    s: string[8];    i: integer;    d: double;end;var   MyList: TList;  PR: PRecord;begin  MyList := TList.Create;        try    New(PR);    PR.s := '10000001';    PR.i := 1001;    PR.d := 0.1;    MyList.Add(P

TList TObjectList的区别和使用

所在的单元 TList(Classes.pas) TObjectList(Contnrs.pas) TObjectList对象的创建方法有一个参数: constructor TObjectList.Create(AOwnsObjects: Boolean); 从字面就可理解其意义:拥有对象集与否. 帮助文档 If the OwnsObjects property is set to true (the default), TObjectList controls the memory of it

序列化TList of objects

Some weeks ago a customer asked to me if it is possibile serialize a TList of objects. “Hey, you should use a TObjectList for this”, I said, but he absolutely needs (I dont know why) of a TList. This is the (simple) sample code tested with Delphi XE2

Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList&lt;T&gt;

Delphi 2009 新增了泛型容器单元: Generics.Collections, 同时还有一个 Generics.Defaults 单元做支持. Generics.Collections 包含了以下实用类:TList<T>TQueue<T>TStack<T>TDictionary<TKey,TValue>TObjectList<T>TObjectQueue<T>TObjectStack<T>TObjectDicti

Delphi 对泛型TList的的改进(TSimpleList)

TSimpleList类应用源码 uSimpleList.pas 源码 unit uSimpleList; interface uses Generics.Collections; type TSimpleList<T> = class(TList<T>) private FCurIndexPos: integer; function DoPopByIndex(Index: integer): T; procedure FreeAllItems; procedure SetCurI

Delphi中TList类应用

在DELPHI中指针最常见的就是和类TLIST结合起来使用.下面是一个很简单的例子,希望对这个例子的分析能让大家对使用TLIST类有一个简单的认识. 代码的功能是使用指针和Tlist来生成一个牌串,并将牌串保存在t_CardInfo中. procedure TForm1.Button1Click(Sender: TObject); const //黑桃,红桃,方块,草花 CardType:array[0..3] of String = ('S','H','D','C'); const //取出的