Das wird ein bisschen unordentlich. Du musst so etwas machen.
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;
Grundsätzlich erstellen Sie eine Instanz von TOwnerComponent
, die von der Owner
, die Sie TOwnedStringList.Create
passieren gehört. Wenn das Owner
stirbt, zerstört es die TOwnerComponent
, die wiederum Ihre String-Liste zerstört.
Der Code ist resilient zu einem expliziten Free
, der in der String-Liste aufgerufen wird.
+1 Gleicher Trick wie mit Schnittstellen in Aufzeichnungen – jpfollenius
Sieht vielversprechend aus. Soll der TOwnerComponent-Konstruktor mit der 'Wiedereinführung'-Direktive erstellt werden? Wie kann ich die 'TOwnedStringList' gegen' sl.Create (nil) 'und explizite' sl.Free' schützen? – ZigiZ
'Create (nil)' ist in Ordnung. Das bedeutet nur, kein Besitzer, lass mich die Verantwortung übernehmen. Oder wenn Sie das nicht wollen, dann lösen Sie eine Ausnahme aus. Explizite 'Free' wird ein wenig mehr nachdenken. Trage mit mir. –