如何使用Owner创建一个TStringList后代,它将自动释放TStringList?

Zig*_*giZ 9 delphi delphi-7

我希望创建类似"TOwnedStringList"(类名是小说)的东西,我可以构造为:

sl := TOwnedStringList.Create(Self);
sl.Sorted := True;
sl.Duplicates := dupIgnore; 
sl.Add(...);
// etc...
Run Code Online (Sandbox Code Playgroud)

哪里Self可以是一个Form(例如),以便所有者将自动释放StringList.我希望能够避免给sl.Free自己打电话.

这可能吗?

Dav*_*nan 13

那会有点混乱.你需要做这样的事情.

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;
Run Code Online (Sandbox Code Playgroud)

基本上,您创建的实例TOwnerComponentOwner您传递给的实例拥有TOwnedStringList.Create.当它Owner死亡时,它会破坏TOwnerComponent它反过来破坏你的字符串列表.

该代码Free对字符串列表上的显式调用具有弹性.

  • 怎么样`if Assigned(FOwner)而不是(csDestroying in FOwner.ComponentState)` (2认同)