2008-12-17 7 views
6

मैंने एक कस्टम नियंत्रण लिखा है, जिसमें कई उप पैनल हैं। मैं इन सब पैनलों को डिज़ाइन समय पर उनके द्वारा छोड़े गए अतिरिक्त नियंत्रणों को स्वीकार करना चाहता हूं।मैं उप-पैनल के साथ कस्टम नियंत्रण कैसे बना सकता हूं जो डिज़ाइनटाइम पर अन्य नियंत्रण स्वीकार करता है?

दुर्भाग्य से डिजाइन समय पर गिराए गए किसी भी नियंत्रण को मेरे कस्टम नियंत्रण पर समाप्त होता है, न कि पैनलों पर। यह विशेष रूप से दिखाता है यदि मैं लेबल छोड़ने का प्रयास करता हूं: लेबल के नीले बिंदुओं को दिखाया गया है, लेकिन यह कैप्शन नहीं है और यदि मैं लेबल को अचयनित करता हूं, तो यह अब बिल्कुल दिखाई नहीं दे रहा है।

सरलीकृत कोड (केवल एक उप पैनल):

type 
    TMyContainer = class(TPanel) 
    p_SubPanel: TPanel; 
    public 
    constructor Create(_Owner: TComponent); override; 
    end; 

    constructor TMyContainer.Create(_Owner: TComponent); 
    begin 
    inherited; 
    p_SubPanel := TPanel.Create(Self); 
    p_SubPanel.Parent := Self; 
    p_SubPanel.Align := alClient; 
    end; 

क्या मैं गलत यहाँ कर रहा हूँ?

(बस के मामले में यह मायने रखती है: मैं डेल्फी 2007 का उपयोग कर रहा)

[संपादित करें]

मैं अब इसे दूसरे तरीके से हल कर लिया है। घटक में अब पैनल नहीं हैं लेकिन बाहरी पैनलों को संदर्भित करता है। यह वास्तव में अधिक लचीला बनाता है, लेकिन नकारात्मक पक्ष पर अब उपयोग करने के लिए सहज नहीं है।

मैं अभी भी जानना चाहता हूं कि मैंने मूल रूप से क्या वर्णन किया है। क्या वहां कोई ओपन सोर्स घटक नहीं है जो ऐसा करता है, इसलिए मैं स्रोत कोड का अध्ययन कर सकता हूं?

उत्तर

1

मैं विवरण से नहीं बता सकता, लेकिन क्या आप लेबल के अभिभावक को उप पैनल में सेट कर रहे हैं? यदि डिज़ाइन समय पर आपको अपने मुख्य घटक (जैसे कंटेनर जो आपके पैनल में हैं) में कोड लिखने की आवश्यकता हो सकती है, यह पता लगाने के लिए कि कौन सा सबपैनल घटक स्वीकार कर रहा है और उस उप-पैनल में लेबल मूल संपत्ति सेट करें।

मुझे यकीन है कि एक घटक को किसी अन्य घटक से जोड़ा या निकाला जाने पर एक अधिसूचना विधि कहा जाता है, इससे आपको यह पता लगाने में मदद करनी चाहिए कि आपको कोड कहां रखना है।

2

यह एक अच्छा सवाल है। आप अपने कस्टम TWinControl को अपने नियंत्रण में csAcceptControls जोड़कर डिज़ाइन-टाइम पर अन्य नियंत्रणों को छोड़ने की अनुमति दे सकते हैं ControlStyle प्रॉपर्टी।

constructor TMyContainer.Create(AOwner: TComponent); 
begin 
    inherited; 
    ControlStyle := ControlStyle + [csAcceptControls]; 
end; 

लेकिन यह बाहर काम करने की कोशिश में, मैं एक कस्टम नियंत्रण के भीतर एक उप पैनल पर नियंत्रण ड्रॉप करने में सक्षम होने के साथ बहुत कम सफलता मिली है। एक उप पैनल के कंट्रोल स्टाइल में csAcceptControls जोड़ना पर्याप्त नहीं है। cloest मैं मिल गया है उप पैनल यह बहुत की तरह डिजाइन किया जा रहा है समझाने के लिए एक हैक है:

type 
    TGiveMeProtected_Component = class(TComponent); 

procedure TMyContainer.Create(AOwner: TComponent); 
begin 
    FSubPanel := TPanel.Create(Self); 
    TGiveMeProtected_Component(FSubPanel).SetDesigning(True, True); 
end; 

, अब आप उप पैनल पर नियंत्रण ड्रॉप कर सकते हैं कि कोड का उपयोग करना है, लेकिन यह भी उप चयन कर सकते हैं इसका मतलब है पैनल, इसकी गुणों को बदलें और इसे हटाएं जिसे आप निश्चित रूप से नहीं चाहते हैं। क्षमा करें, मैं जवाब के साथ नहीं आ सकता था, मुझे अभी भी यह जानना अच्छा लगेगा कि आप इसे काम करते हैं या नहीं। :)

0

मैंने ऐसा किया, लेकिन नियमित पैनलों के साथ नियंत्रण को बदल दिया जो आवश्यक होने पर दिखाया/छुपाया जाएगा।

टीपीनल से उतरने के बजाय मेरे नियंत्रण TCustomControl से निकलते हैं। मुझे नहीं लगता कि मैं इसे टीपीनल से उतरने के लिए प्राप्त कर सकता हूं लेकिन याद नहीं कर सकता कि समस्या क्या थी।

कंटेनर नियंत्रण:

TPageControl = class(TCustomControl) 
private 
    PageList:TObjectList; // To hold references to all sub-pages for easy access. 
end; 

constructor TPageControl.Create(AOwner: TComponent); 
begin 
    inherited; 
    ControlStyle := ControlStyle + [csAcceptsControls]; 
    PageList := TObjectList.Create; 
    PageList.OwnsObjects := false; 
end; 

destructor TVstPageControl.Destroy; 
begin 
    PageList.Free; 
    inherited; 
end; 

procedure TPageControl.NewPage; 
var 
    Page:TPage; 
begin 
    Page := TPage.Create(Self.Owner); 
    Page.Parent := Self; 
    Page.Align := alClient; 

    PageList.Add(Page); 
end; 

procedure TPageControl.DeletePage(Index:integer); 
var 
    Page:TPage; 
begin 
    Page := PageList[Index] as TPage; 
    Page.Free; 
    PageList.Delete(Index); 
end; 

पेज/उप पैनल नियंत्रण:

TVstPage = class(TCustomControl) 
public 
    constructor Create(AOwner: TComponent); override; 
end; 

constructor TPage.Create(AOwner: TComponent); 
begin 
    inherited; 
    ControlStyle := ControlStyle + [csAcceptsControls]; 
end; 
संबंधित मुद्दे