gpt4 book ai didi

delphi - 如何使用 Owner 创建一个 TStringList 后代并自动释放 TStringList?

转载 作者:行者123 更新时间:2023-12-03 14:43:17 31 4
gpt4 key购买 nike

我希望创建类似“TOwnedStringList”(类名是虚构的)的东西,我可以将其构造为:

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

其中 Self 可以是一个表单(例如),以便所有者将自动释放 StringList。我希望能够避免自己调用 sl.Free

这可能吗?

最佳答案

这会有点困惑。你需要做这样的事情。

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 实例,该实例由您传递给 TOwnedStringList.CreateOwner 所有。当 Owner 死亡时,它会销毁 TOwnerComponent,而 TOwnerComponent 又会销毁您的字符串列表。

代码对于在字符串列表上调用显式Free具有弹性。

关于delphi - 如何使用 Owner 创建一个 TStringList 后代并自动释放 TStringList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15201857/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com