2.TObjectList 類
TObjectList 類直接從TList 類繼承,可以作為對象的容器。
不同於TList類,TObjectList類的Add, Remove, IndexOf, Insert等方法都需要傳遞TObject對象作為參數,由於有了編譯期的強類型檢查,使得TObjectList比TList更適合保存對象。此外TObjectList對象有OwnsObjects屬性。當設定為True (默認值),同TList類不同,TObjectList對象將銷毀任何從列表中刪除的對象。無論是調用Delete, Remove, Clear 方法,還是釋放TObjectList對象,都將銷毀列表中的對象。有了TObjectList類,我們就再也不用使用循環來釋放了對象。這就避免了釋放鏈表對象時,由於忘記釋放鏈表中的對象而導致的內存洩漏。另外要注意的是OwnsObjects屬性不會影響到Extract方法,TObjectList的Extract方法行為類似於TList,只是從列表中移除對象引用,而不會銷毀對象。
TObjectList 對象還提供了一個FindInstanceOf 函數,可以返回只有指定對象類型的對象實例在列表中的索引。如果AExact 參數為True,只有指定對象類型的對象實例會被定位,如果AExact 對象為False,AClass 的子類實例也將被定位。AStartAt 參數可以用來找到列表中的多個實例,只要每次調用FindInstanceOf 函數時,將起始索引加1,就可以定位到下一個對象,直到FindInstanceOf 返回-1。下面是代碼示意:
var
idx:Integer;
begin
idx:=-1;
repeat
idx:=ObjList.FindInstanceOf(TMyObject,True,idx+1);
ifidx>=0then
...
until(idx<0);
end;
3.TComponentList 類
注意TComponentList 是從TObjectList類繼承出來的,它的Add, Remove, IndexOf, Insert和 Items 方法調用都使用TComponent 類型的參數而不再是TObject類型,因此適合作為TComponent對象的容器。TComponentList 類還有一個特殊的特性,就是如果鏈表中的一個組件被釋放的話,它將被自動的從TComponentList 鏈表中刪除。這是利用TComponent的FreeNotification方法可以在組件被銷毀時通知鏈表,這樣鏈表就可以將對象引用從鏈表中刪除的。
4.TClassList 類
不同於前面兩個類,這個類繼承於TList的類只是將Add, Remove, IndexOf, Insert和Items 調用的參數從指針換成了TClass元類類型。
5.TOrderedList, TStack和TQueue 類
要注意雖然TOrderedList 並不是從TList繼承的,但是它在內部的實現時,使用了TList來儲存指針。另外注意TOrderedList類的PushItem 過程是一個抽象過程,所以我們無法實例化 TOrderedList 類,而應該從TOrderedList繼承新的類,並實現抽象的PushItem方法。TStack 和 TQueue 正是實現了PushItem抽象方法的類, 我們可以實例化TStack 和TQueue類作為後進先出的堆棧 (LIFO)和先進先出的隊列(FIFO)。下面是這兩個的的方法使用說明:
· Count 返回列表中的項目數。
· AtLeast 可以用來檢查鏈表的大小,判斷當前列表中的指針數目是否大於傳遞的參數值,如果為True表示列表中的項目數大於傳來的參數。
· 對於TStack類Push 方法將指針添加到鏈表的最後,對於TQueue類Push 方法則將指針插入到鏈表的開始。
· Pop返回鏈表的末端指針,並將其從鏈表中刪除。
· Peek返回鏈表的末端指針,但是不將其從鏈表中刪除。