所有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継承以外のもの
(自分でメモリ確保した構造型のポインタとか)
を保持させても正しく動作しないでしょうから

勉強のためのクラスだと考えてください。