Delphi XE でジェネリック型定義に関する奇妙な問題を発見しました。いくつかのクラスを含むTObjectListの派生物を作成しました(fIndex の例)。次に、所有者へのリンクを含む子孫クラスTMyButtonlistを作成します。オブジェクトfIndexは作成されないため、破棄時にはnilでなければなりません。しかし、fOwer変数を設定すると、fIndex変数は同じポインターを取得し、破壊時にクラッシュします。
type
TMyObjectList<T:class> = class(TObjectList<T>)
private
fIndex:TStringList;
public
destructor Destroy; override;
end;
TMyButtonList = class(TMyObjectList<TButton>)
private
Owner:TObject;
end;
destructor TMyObjectList<T>.Destroy;
begin
fIndex.Free;
inherited;
end;
procedure TMainForm.btnClick(Sender: TObject);
var
Buttonlist:TMyButtonList;
begin
Buttonlist:=TMyButtonList.Create;
Buttonlist.Owner := Self;
ButtonList.Free;
end;