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經常用來保存一組對象列表,基於數組實現的機制使得用下標存取容器中的對象非常快,但是隨着容器的對象的增多,插入和刪除對象速度直線下降,因此不適合頻繁增加和刪除對象的應用場景。

  下面是TList類的屬性和方法說明:

  • Count: Integer;  屬性。返回列表中的項目數。
  • Items[Index: Integer]: Pointer; default  屬性。通過以0為底的索引下標直接存取列表中的項目。
  • Add(Item: Pointer): Integer;  函數。用來向列表中添加指針。
  • Clear;  過程。清空列表中的項目。
  • Delete(Index: Integer);  過程。刪除列表中對應索引的項目。
  • IndexOf(Item: Pointer):Integer;  函數。返回指針在列表中的索引。
  • Remove(Item: Pointer): integer;  函數。從列表中刪除指針。
  • Capacity: Integer。  屬性。可以用來獲取或設定列表可以容納的指針的數目。
  • Extract(Item: Pointer): Pointer;  函數。Extract類似於Remove可以將指針從列表中刪除,不同的是返回被刪除的指針。
  • Exchange(Index1, Index2: Integer);  過程。交換列表中的兩個指針。
  • First: Pointer;  函數。返回鏈表中的第一個指針。
  • Last: Pointer;  函數。返回鏈表中的最后一個指針。
  • Move(CurIndex, NewIndex: Integer);  過程。將指針從當前位置移動到新的位置。
  • Pack;  過程。從列表中刪除所有nil的指針。
  • Sort(Compare: TListSortCompare);  過程。用來對鏈表中的項目進行排序,可以設定Compare參數為用戶定制的排序函數。

 

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元類類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM