Điều đó sẽ hơi lộn xộn một chút. Bạn sẽ cần phải làm một cái gì đó như thế này.
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;
Về cơ bản bạn tạo một thể hiện của TOwnerComponent
được sở hữu bởi các Owner
mà bạn vượt qua để TOwnedStringList.Create
. Khi đó Owner
chết, nó phá hủy các TOwnerComponent
mà lần lượt phá hủy danh sách chuỗi của bạn.
Mã này có khả năng đàn hồi để rõ ràng Free
đang được gọi trong danh sách chuỗi.
Nguồn
2013-03-04 12:54:06
+1 Mẹo tương tự như với giao diện trong hồ sơ – jpfollenius
Có vẻ đầy hứa hẹn. Nếu hàm tạo TOwnerComponent được tạo bằng chỉ thị 'reintroduce'? Ngoài ra, Làm thế nào tôi có thể bảo vệ 'TOwnedStringList' chống lại' sl.Create (nil) 'và' sl.Free' rõ ràng? – ZigiZ
'Tạo (nil)' là tốt. Điều đó chỉ có nghĩa là, không có chủ sở hữu, hãy để tôi chịu trách nhiệm về quyền sở hữu. Hoặc nếu bạn không muốn điều đó, thì hãy đưa ra một ngoại lệ. Rõ ràng 'Free' sẽ mất một chút suy nghĩ về. Chịu với tôi. –