Delphi Tips 
-----------------------------

0254  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/09/15 おばQ rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 1999/09/21 おばQ 編集
TListを特定のクラスのListにする方法

みなさん、TListって使ってます?
TListはItemsプロパティで、いろんなオブジェクトにアクセスできる
とても便利なコレクションクラス(リスト)です。
これを利用すればコンポーネント配列なんて特に必要なくなりますし、
自分で作ったクラスが保持できます。

しかし、こういうコーディングしていませんか?

TMyClass( TList.Items[i] ).MyClassProperty

実際には特定のクラスのみItemsに保持したい場合が多いのに
TListはPointerを保持する汎用的なListなので
キャストしないとプロパティやメソッドが使えません。
TListのItemにアクセスするたびに
毎回キャストしなくてはいけないのであれば、大変めんどうですし
コーディング量も増えて綺麗ではありません。

そういう場合はTListを継承してしまいましょう。
とてもあっさりと可能です。

type節に追加します
  TMyClassList = class(TList)
  private
    function Get(Index: Integer): TMyClass;
    procedure Put(Index: Integer; const Value: TMyClass);
  public
    property Items[Index: Integer]: TMyClass read Get write Put; default;
  end;

実装部には
{ TMyClassList }
function TMyClassList.Get(Index: Integer): TMyClass;
begin
  Result :=  TMyClass( inherited Get(Index) );
end;

procedure TMyClassList.Put(Index: Integer; const Value: TMyClass);
begin
  inherited Put( Index, Value );
end;

TMyClassは適当に変えてください。
これだけで、TListを使うのとほとんど同様に
TMyClassList.Items[i].MyClassProperty
という風にスッキリと使えます。

また、TListを継承する時ついでに
  TMyClassList = class(TList)
  public
    destructor Destroy; override;

destructor TMyClassList.Destroy;
var
  i: Integer;
begin
  for i := 0 to Self.Count - 1 do
    Self.Items[i].Free;
  inherited Destroy;
end;

と実装しておくとListが破棄される時に
所有するItemも一緒に破棄されるので
結構便利に使えるでしょう。
参照: <PASCAL>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp