2014-02-20 31 views
-1

我已經開始在Delphi XE中使用TCollection類,並且我在Using TOwnedCollection descendant in Delphi找到答案是一個很好的起點。 TCollection管理一個TCollectionItems列表。但是我注意到TCollection.Add似乎並沒有將TCollectionItem添加到Collections數組,實際上我的測試似乎證實了這一點。在TCollection本身的代碼是:TCollection.Add實際添加?

function TCollection.Add: TCollectionItem; 
begin 
    Result := FItemClass.Create(Self); 
    Added(Result); 
end; 

FItemClass是將要創建的對象類型,我想加入到TCollection對象。 Added()方法已被棄用,並且似乎是舊的通知方法。我沒有看到結果被添加到集合中。應該如何將TCollectionItem添加到TCollection?

+0

是不是TCollection是抽象類?也許後代會重寫其中的一個方法。只是一個想法 – DavidG

+0

通過源代碼看後,我有一個部分回答上述問題。創建TCollectionItem的行爲在TCollection對象中創建一個條目,因爲Collection對象被傳遞給CollectionItem構造函數。我忘記調用構造函數中的繼承方法,因爲繼承方法反過來調用setCollection,它實際添加。但是,我仍然不完全確定爲什麼添加稱爲添加。 – rhody

回答

4

TCollectionItem.Create(Collection: TCollection)調用TCollectionItem.SetCollection,它增加了項目Collection

procedure TCollectionItem.SetCollection(Value: TCollection); 
begin 
    if FCollection <> Value then 
    begin 
    if FCollection <> nil then FCollection.RemoveItem(Self); 
    if Value <> nil then Value.InsertItem(Self); 
    end; 
end; 

這就是所謂的TCollection.Add,因爲它創建集合項目,該項目構造函數添加項目到含集合。所以TCollection.Add確實創建了該項目(在該過程中將項目添加到自己),並返回對該新創建項目的引用。 (您可以使用該參考來設置TCollectionItem本身的屬性。)

相關問題