在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
转载自:http://blog.csdn.net/iseekcode/article/details/4922001
从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类,全部都是基于标准的TList类。 TList TList类实际上就是一个可以存储指针的容器类,提供了一系列的方法和属性来增加、删除、重排、定位、存取和排序容器中的类,它是基于数组的机制来实现的容器,比较类似于C++中的Vector和Java中的ArrayList。 TList经常用来保存一组对象列表,基于数组实现的机制使得用下标存取容器中的对象非常快,但是随着容器的对象的增多,插入和删除对象速度直线下降,因此不适合频繁增加和删除对象的应用场景。 下面是TList类的属性和方法说明:
TObjectList TObjectList类直接从TList类继承,可以作为对象的容器。TObjectList类定义如下: TObjectList = class(TList) ... public constructor Create; overload; constructor Create(AOwnsObjects: Boolean); overload; function Add(AObject: TObject): Integer; function Remove(AObject: TObject): Integer; function IndexOf(AObject: TObject): Integer; function FindInstanceOf(AClass: TClass; AExact: Boolean=True; AStartAt:Integer=0):Integer; procedure Insert(Index: Integer; AObject: TObject); property OwnsObjects: Boolean; property Items[Index: Integer]: TObject; default end; 不同于TList类,TObjectList类的Add、Remove、IndexOf、Insert等方法都需要传递TObject对象作为参数,由于有了编译期的强类型检查,使得TObjectList比TList更适合保存对象。 此外TObjectList对象有OwnsObjects属性。当设定为True(默认值),同TList类相同,TObjectList对象将销毁任何从列表中删除的对象。 有了TObjectList类,我们就再也不用使用循环来释放对象了。这就避免了释放链表对象时,由于忘记释放链表中的对象而导致的内存泄漏。 另外需要注意的是OwnsObjects属性不会影响到Extract方法,TObjectList的Extract方法行为类似于TList,知识从列表中移除对象引用,而不会销毁对象。
TObjectList对象还提供了一个FindInstanceOf 函数,可以返回只有指定对象类型的对象在列表中的索引。如果AExtract参数为True,只有指定对象类型的对象实例会被定位,如果AExtract对象为False,AClass的子类实例也将被定为。AStartAt参数可以用来找到列表中的多个实例,只要每次调用FindInstanceOf函数时,将起始索引加1,就可以定位到下一个对象,之道FindInstanceOf 返回-1。下面是示例代码: var idx: Integer; begin idx:= -1; repeat idx:= Object.FindInstanceOf(TMyObject, True, idx+1); if idx>=0 then ... until(idx<0); end;
TComponentList Contnrs单元中还定义了TCompontentList类,类定义如下 TComponentList = class(TObjectList) ... public function Add(AComponent: TComponent): Integer; function Remove(AComponent: TComponent): Integer; function IndexOf(AComponent: TComponent): Integer; procedure Insert(Index: Integer; AComponent: TComponent); property Items[Index: Integer]: TComponent; default; end; 注意TComponentList是从TObjectList类继承出来的,它的Add、Remove、IndexOf、Insert和Items方法调用都使用TComponent类型的参数而不再是TObject类型,因此适合作为TComponent对象的容器。 TComponentList类还有一个特殊的特性,就是如果链表中的一个组件被释放的话,它将自动的从TComponentList链表中删除。这是利用TComponent的FreeNotification方法可以在组件被销毁时通知链表,这样链表就可以将对象引用从链表中删除的。
TClassList类 Contnrs单元中还定义了TClassList类,类定义如下 TClassList = class(TList) protected function GetItems(Index: Integer): TClass; procedure SetItems(Index: Integer; AClass: TClass); public function Add(aClass: TClass): Integer; function Remove(aClass: TClass): Integer; function IndexOf(aClass: TClass): Integer; procedure Insert(Index: Integer; aClass: TClass); property Items[Index: Integer]: TClass read GetItems write SetItems; default; end; 不同于前面的两个类,这个类继承自TList,只是将Add、Remove、IndexOf和Items调用的参数从指针换成了TClass元类类型 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论