2011-09-16 8 views
7

पर किसी घटक के प्रॉपर्टी एडिटर का आह्वान कैसे करें मैंने TCustomPanel से व्युत्पन्न एक घटक बनाया है। उस पैनल पर मेरे पास TOwnedCollection से व्युत्पन्न कक्षा की एक प्रकाशित संपत्ति है। सभी अच्छी तरह से काम कर रहे हैं और उस संपत्ति के ऑब्जेक्ट इंस्पेक्टर में इलिप्सिस पर क्लिक करने से डिफ़ॉल्ट संग्रह संपादक खुलता है जहां मैं सूची में TCollectionItems का प्रबंधन कर सकता हूं।डिज़ाइन समय

TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 

मैं डिज़ाइन-टाइम पर पैनल पर डबल-क्लिक करने में सक्षम होना चाहूंगा और संग्रह संपादक को डिफ़ॉल्ट रूप से खोलना होगा। मैंने टीडीफॉल्ट एडिटर से ली गई कक्षा बनाने और इसे पंजीकृत करके शुरू कर दिया है।

TMyCustomPanelEditor = class(TDefaultEditor) 
    protected 
    procedure EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); override; 
    end; 

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

यह सही समय पर चलाया जा रहा है, लेकिन मैं कैसे उस समय संग्रह के लिए संपत्ति संपादक शुरू करने के लिए पर अटक कर रहा हूँ।

procedure TMyCustomPanelEditor.EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); 
begin 
    inherited; 

    // Comes in here on double-click of the panel 
    // How to launch collection editor here for property MyOwnedCollection? 

    Continue := false; 
end; 

किसी भी समाधान या विभिन्न दृष्टिकोण की सराहना की जाएगी।

उत्तर

9

आप सही संपादक का उपयोग नहीं कर रहे हैं, जहां तक ​​मैं कह सकता हूं। TDefaultEditor इस प्रकार वर्णित है:

एक संपादक है कि डबल क्लिक करें कि गुण सबसे उपयुक्त विधि संपत्ति की तलाश के माध्यम से पुनरावृति जाएगा के लिए डिफ़ॉल्ट व्यवहार प्रदान करता है

संपादित करने के लिए यह एक संपादक है कि के लिए और जवाब नए बनाए गए ईवेंट हैंडलर के साथ कोड संपादक में आपको छोड़कर फ़ॉर्म पर डबल क्लिक। सोचें कि क्या होता है जब आप TButton पर डबल क्लिक करते हैं और आपको OnClick हैंडलर में गिरा दिया जाता है।

यह एक लंबा समय रहा है जब से मैंने एक डिज़ाइन टाइम एडिटर लिखा था (मुझे आशा है कि मेरी याददाश्त आज काम कर रही है) लेकिन मेरा मानना ​​है कि आपका संपादक TComponentEditor से लिया जाना चाहिए। संग्रह संपादक को दिखाने के लिए आप को ColnEdit इकाई से कॉल करें।

आप TComponentEditor की Edit विधि को ओवरराइड कर सकते हैं और वहां से ShowCollectionEditor पर कॉल कर सकते हैं। यदि आप अधिक उन्नत होना चाहते हैं, तो वैकल्पिक रूप से आप GetVerbCount, GetVerb और ExecuteVerb के साथ कुछ क्रियाएं घोषित कर सकते हैं। यदि आप इसे इस तरह करते हैं तो आप संदर्भ मेनू का विस्तार करते हैं और डिफ़ॉल्ट Edit कार्यान्वयन क्रिया 0 निष्पादित करेगा।

+1

टीकंपोनेंट एडिटर से व्युत्पन्न करना और शोकॉलेक्शन एडिटर को कॉल करने के लिए प्राप्त/निष्पादित करने के लिए निष्पादित करना पूरी तरह से काम करता है। आपका बहुत बहुत धन्यवाद। – avenmore

+0

वाह, मुझे स्वीकार करना होगा कि मैं थोड़ा आश्चर्यचकित हूं कि यह वास्तव में इतना आसान था, सचमुच उम्र पहले था जब मैंने आखिरी बार ऐसा कुछ किया था! –

5

डेविड के सही उत्तर के बाद, मैं पूरा कोड प्रदान करना चाहता हूं जो यूआई की विशिष्ट संपत्ति के लिए CollectionEditor दिखाता है नियंत्रण समय पर डबल-क्लिक होने पर नियंत्रण करें।

type 
    TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 


    TMyCustomPanelEditor = class(TComponentEditor) 
    public 
    function GetVerbCount: Integer; override; 
    function GetVerb(Index: Integer): string; override; 
    procedure ExecuteVerb(Index: Integer); override; 
    end; 


procedure Register; 
begin 
    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 
end; 

function TMyCustomPanelEditor.GetVerbCount: Integer; 
begin 
    Result := 1; 
end; 

function TMyCustomPanelEditor.GetVerb(Index: Integer): string; 
begin 
    Result := ''; 
    case Index of 
    0: Result := 'Edit MyOwnedCollection'; 
    end; 
end; 

procedure TMyCustomPanelEditor.ExecuteVerb(Index: Integer); 
begin 
    inherited; 
    case Index of 
    0: begin 
      // Procedure in the unit ColnEdit.pas 
      ShowCollectionEditor(Designer, Component, TMyCustomPanel(Component).MyOwnedCollection, 'MyOwnedCollection'); 
     end; 
    end; 
end; 
+0

अच्छा उदाहरण! धन्यवाद! – REALSOFO

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