所有Itemを自動破棄してくれるリストを自作する
|
66 |
ItemDeleteList |
動作確認 |
Delphi2007 |
更新日 |
2008/01/31(木) |
TListはポインタのリストなので
ポインタの指し示す先のItemは破棄・削除してくれません。
D5から組み込まれたTObjectListは
デフォルトの OwnsObjects=True の状態の時
Itemを破棄・削除してくれます。
TObjectListを使うほうが実用的ですが
仕組みを勉強する為に
TListを使ってFree時やClear呼び出し時に
Itemを破棄してくれるリストを作ってみましょう。
────────────────────
//Free時に所有ItemもFreeしてくれるリスト
TMyList = class(TList)
public
procedure Clear; override;
end;
{ TMyList }
procedure TMyList.Clear;
var
i: Integer;
begin
for i := 0 to Self.Count-1 do
begin
if Assigned(Items[i]) then
TObject(Items[i]).Free;
end;
inherited Clear;
end;
────────────────────
TListに保持させているものがクラスなら
(というかクラスしか想定してませんが)
MyList.Freeとすると、所有しているItemも破棄してくれます。
参考にTListのDestroyの実装を見ておきます
────────────────────
TList = class(TObject)
private
…省略…
public
destructor Destroy; override;
procedure Clear; virtual;
…省略…
end;
destructor TList.Destroy;
begin
Clear; //ここでClearを使っている事がわかる。
end;
────────────────────
TListでは
デストラクタでClearを使っているので
TMyListではTList.Clearをoverrideしています。
TMyList.Freeを実行する時に、TList.Freeが呼ばれて
TList.Destroyが呼ばれ、Clearが呼ばれると
TMyList.Clearのコードが実装されるという仕組みなので
TMyList.Clearを実装するだけでTMyList.Freeの時にも
TMyList.Clearが呼び出されます。
クラスの継承関係を理解するとより理解できるでしょう。
TMyListにTObject継承以外のもの
(自分でメモリ確保した構造型のポインタとか)
を保持させても正しく動作しないでしょうから
勉強のためのクラスだと考えてください。
|