2013-10-22 35 views
0

我有一個自定義組件'TCARD'的銷燬過程。然後在運行時我創建一個數組如何銷燬自定義組件的數組

Cards: array[1..20] of TCards 

然後我做一些事情...... 和程序結束時,我想摧毀陣列中的所有TCards。我如何做到這一點,或者我必須每次都這樣做。

cards[1].destroy; 
cards[2].destroy; 
.... 
cards[20].destroy; 
+2

停止並使用TObjectList 。對象銷燬由列表管理。 – whosrdaddy

+0

還沒有使用TobjectList 將調查它..但如果我使用,那麼我可以做一個TObjectlist.destroy? –

+0

TObjectList 是你需要的。但是你有沒有聽說過for循環?嚴重的是,如果你看不到這個解決方案,你需要回到基礎知識。 –

回答

6

如果您使用TObjectList<T>,這將爲您完成,您所需要做的就是銷燬該列表。

Uses 
    Generics.Collections, 
... 

// define your list 
Cards: TObjectList<TCard>; 

... 

// create list 
Cards := TObjectList<TCard>.Create; 
try 
// Create and add your card objects 
ACard := TCard.Create; 
Cards.Add(ACard); 
// do something with Cards 
... 
// destroy cards - this will automatically free the objects owned by the list 
finally 
Cards.Free; 
end; 

作爲一個額外的獎勵,你可以使自己的自定義對象,並添加卡相關的功能。

type 
    TMyCardList = class(TObjectList<TCard>) 
    public 
    // add needed behaviours 
    function FindHighestCardBySuit(ASuit : TSuit) : TCard; 
    procedure Shuffle; 
    // etc ... 
    end; 

如果由於某種原因你不想使用TObjectList,您可以自由使用一個簡單的循環中的對象:使用數組的對象

procedure FreeCards(Cards : TCards); 

var 
    Card : TCard; 

begin 
For Card in Cards do 
    Card.Free; 
end; 
+0

謝謝,我會嘗試這 –

+0

與卡做一些事情。目前我有例如'cards [i] .Cname:= adoquery1.FieldByName('Name')。AsString;'我假設我仍然可以做這樣的事情抱歉,我還沒有搜索,只是仍然在更改代碼 –

+0

是的,你可以循環它們就像一個正常的數組:) – whosrdaddy