यह थोड़ा गन्दा होने जा रहा है। आपको ऐसा कुछ करने की ज़रूरत होगी।
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
का एक उदाहरण है कि Owner
कि आप TOwnedStringList.Create
के पास के स्वामित्व में है बनाएँ। जब Owner
मर जाता है, तो यह TOwnerComponent
को नष्ट कर देता है जो बदले में आपकी स्ट्रिंग सूची को नष्ट कर देता है।
कोड स्ट्रिंग सूची पर एक स्पष्ट Free
को कॉल करने के लिए लचीला है।
स्रोत
2013-03-04 12:54:06
+1 रिकॉर्ड्स में इंटरफेस के साथ समान चाल – jpfollenius
आशाजनक लग रहा है। क्या TownerComponent कन्स्ट्रक्टर 'reintroduce' निर्देश के साथ बनाया जाना चाहिए? साथ ही, मैं 'slwnedStringList' को' sl.Create (nil) 'और स्पष्ट' sl.Free' के विरुद्ध कैसे सुरक्षित रख सकता हूं? – ZigiZ
'बनाएँ (शून्य) 'ठीक है। इसका मतलब है, कोई मालिक नहीं, मुझे स्वामित्व का प्रभार लेने दो। या यदि आप इसे नहीं चाहते हैं, तो अपवाद उठाएं। स्पष्ट 'फ्री' के बारे में थोड़ा और सोच लेगा। धैर्य रखने के लिए अनुरोध। –