9

「TOwnedStringList」(クラス名はフィクション)のようなものを作成したいと思っています。これは次のように作成できます。

sl := TOwnedStringList.Create(Self);
sl.Sorted := True;
sl.Duplicates := dupIgnore; 
sl.Add(...);
// etc...

Self所有者がStringListを自動的に解放するように、フォームはどこにあるか(たとえば)。自分を呼ばないようにしたいとsl.Free思います。

これは可能ですか?

4

1 に答える 1

14

それは少し厄介になるでしょう。あなたはこのようなことをする必要があるでしょう。

type
  TOwnerComponent = class(TComponent)
  private
    FOwnedObject: TObject;
  public
    constructor Create(Owner: TComponent; OwnedObject: TObject);
    destructor Destroy; override;
  end;

  TOwnedStringList = class(TStringList)
  private
    FOwner: TOwnerComponent;
  public
    constructor Create(Owner: TComponent);
    destructor Destroy; override;
  end;

{ TOwnerComponent }

constructor TOwnerComponent.Create(Owner: TComponent; OwnedObject: TObject);
begin
  inherited Create(Owner);
  FOwnedObject := OwnedObject;
end;

destructor TOwnerComponent.Destroy;
begin
  FOwnedObject.Free;
  inherited;
end;

{ TOwnedStringList }

constructor TOwnedStringList.Create(Owner: TComponent);
begin
  inherited Create;
  if Assigned(Owner) then
    FOwner := TOwnerComponent.Create(Owner, Self);
end;

destructor TOwnedStringList.Destroy;
begin
  if Assigned(FOwner) and not (csDestroying in FOwner.ComponentState) then
  begin
    FOwner.FOwnedObject := nil;
    FOwner.Free;
  end;
  inherited;
end;

基本的に、に渡すTOwnerComponentが所有するインスタンスを作成します。それが死ぬと、それはあなたの文字列リストを破壊します。OwnerTOwnedStringList.CreateOwnerTOwnerComponent

このコードはFree、文字列リストで明示的に呼び出されても回復力があります。

于 2013-03-04T12:54:06.250 に答える