2013-03-04 5 views
9

मैं (वर्ग के नाम एक कल्पना है) कि मैं के रूप में निर्माण कर सकता है एक "TOwnedStringList" की तरह कुछ बनाने के लिए आशा करती हूं कि:स्वामी के साथ एक TStringList वंशज कैसे बनाएं जो TStringList को स्वतः मुक्त कर देगा?

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

कहाँ Self एक फॉर्म (उदाहरण के लिए) हो सकता है, इतना है कि मालिक होगा ऑटो मुक्त स्ट्रिंगलिस्ट। मैं खुद को sl.Free पर कॉल करने से बचने में सक्षम होना चाहता हूं।

क्या यह संभव है?

उत्तर

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; 

मूल रूप से आप TOwnerComponent का एक उदाहरण है कि Owner कि आप TOwnedStringList.Create के पास के स्वामित्व में है बनाएँ। जब Owner मर जाता है, तो यह TOwnerComponent को नष्ट कर देता है जो बदले में आपकी स्ट्रिंग सूची को नष्ट कर देता है।

कोड स्ट्रिंग सूची पर एक स्पष्ट Free को कॉल करने के लिए लचीला है।

+0

+1 रिकॉर्ड्स में इंटरफेस के साथ समान चाल – jpfollenius

+1

आशाजनक लग रहा है। क्या TownerComponent कन्स्ट्रक्टर 'reintroduce' निर्देश के साथ बनाया जाना चाहिए? साथ ही, मैं 'slwnedStringList' को' sl.Create (nil) 'और स्पष्ट' sl.Free' के विरुद्ध कैसे सुरक्षित रख सकता हूं? – ZigiZ

+1

'बनाएँ (शून्य) 'ठीक है। इसका मतलब है, कोई मालिक नहीं, मुझे स्वामित्व का प्रभार लेने दो। या यदि आप इसे नहीं चाहते हैं, तो अपवाद उठाएं। स्पष्ट 'फ्री' के बारे में थोड़ा और सोच लेगा। धैर्य रखने के लिए अनुरोध। –

संबंधित मुद्दे