我希望创建类似"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)
基本上,您创建的实例TOwnerComponent由Owner您传递给的实例拥有TOwnedStringList.Create.当它Owner死亡时,它会破坏TOwnerComponent它反过来破坏你的字符串列表.
该代码Free对字符串列表上的显式调用具有弹性.