2012-04-17 20 views
7

मेरे पास एक कस्टम घटक है (TCustomPanel से विरासत) जिसमें दो अन्य घटक होते हैं (चलिए दो संपादन कहते हैं)। घटक का उपयोग करते समय मैं टैब ऑर्डर सही कैसे प्राप्त करूं?कस्टम घटक और टैब ऑर्डर

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

मैं इस स्थिति में टैब ऑर्डर कैसे बदल सकता हूं?

+1

क्या आप अपने घटक के निर्माता में टैब ऑर्डर सेट नहीं कर सकते हैं? –

+0

@ डेविड हेफरनन नहीं क्योंकि आसपास के रूप में टैब ऑर्डर समस्या है। – jpfollenius

+0

मेरी धारणा यह है कि दो संपादन नियंत्रण पैनल के बच्चे हैं। क्या यह मामला नहीं है? –

उत्तर

13

आपके घटक के भीतर उन नेस्टेड नियंत्रणों का टैब ऑर्डर उस फ़ॉर्म के टैब ऑर्डर से अलग है जिस पर आपका घटक रहता है। फ़ॉर्म की टैब ऑर्डर सूची में घटक का टैब ऑर्डर तब होता है जब आप नेस्टेड कंट्रोल पर टैब करते हैं। एक बार सभी टैब क्रम सूचियों संयुक्त, वे अंतिम चक्र में परिणाम:

  • फार्म पर एक नियंत्रण (TabOrder=0)
  • दूसरा रूप पर नियंत्रण (TabOrder=1)
  • आपका पैनल घटक (TabOrder=2)
    • 1 संपादित करें (TabOrder=0)
    • 2 संपादित करें (TabOrder=1)
  • फार्म पर एक और नियंत्रण (TabOrder=3)

पैनल घटक डिजाइन समय की टैब क्रम सेट करने में सक्षम होने के लिए:

  • उपयोग डिजाइनर में टैब क्रम संपादक (राइट क्लिक घटक के अभिभावक पर) और संपादक में तीर के साथ टैब ऑर्डर बदलें, या
  • अपने घटक के लिए TabOrder संपत्ति प्रकाशित करें और इसे ऑब्जेक्ट इंस्पेक्टर में सेट करें:

    type 
        TMyPanel = class(TCustomPanel) 
        published 
        property TabOrder; 
        end; 
    

रनटाइम पर यह हमेशा के बाद से TabOrder संपत्ति TWinControl में सार्वजनिक घोषित किया जाता है घटक के टैब क्रम स्थापित करने के लिए संभव है।

... जो फोकस नहीं कर सकता क्योंकि यह एक पैनल है।

नहीं, कोई पैनल फोकस ठीक कर सकता है, लेकिन डिफ़ॉल्ट रूप से नहीं होगा। इसे TabStop संपत्ति के साथ संभाला जाता है, जो डिफ़ॉल्ट रूप से False है। आप TabStop को अपने घटक के लिए True सेट करने के लिए नहीं चाहते हैं (1) एक पैनल के पास कोई संकेतक नहीं है और यह (2) यह वांछित नहीं है (मुझे कल्पना है)।


नेस्टेड नियंत्रणों के टैब ऑर्डर को बदलना अधिमानतः आपके घटक के निर्माता या रनटाइम में किया जाता है।

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

सबसे पहले, ध्यान दें कि डिजाइनर में टैब ऑर्डर संपादक के साथ उन संपादनों के टैब ऑर्डर को सेट करना (पैनल घटक पर राइट क्लिक करें) टैब ऑर्डर बदल देंगे, लेकिन यह नहीं टिकेगा। ऐसा इसलिए है क्योंकि उन परिवर्तनों को डीएफएम में स्ट्रीम नहीं किया जाता है।

स्ट्रीम/नियंत्रण के डिजाइन समय परिवर्तन सहेजने के लिए सक्षम होने के लिए, आप उन्हें प्रकाशित करने की जरूरत:

type 
    TMyPanel = class(TCustomPanel) 
    private 
    FEdit1: TEdit; 
    FEdit2: TEdit; 
    public 
    constructor Create(AOwner: TComponent); override; 
    published 
    property Edit1: TEdit read FEdit1; 
    property Edit2: TEdit read FEdit2; 
    end; 

constructor TMyPanel.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FEdit1 := TEdit.Create(Self); 
    FEdit1.SetBounds(10, 10, 100, 21); 
    FEdit1.Name := 'Edit1'; 
    FEdit1.Parent := Self; 
    FEdit1.SetSubComponent(True); 
    FEdit2 := TEdit.Create(Self); 
    FEdit2.SetBounds(10, 41, 100, 21); 
    FEdit2.Name := 'Edit2'; 
    FEdit2.Parent := Self; 
    FEdit2.SetSubComponent(True); 
end; 

बेशक यह उन नियंत्रणों के सभी गुण प्रकाशित करता है और अब उन बदल सकते हैं जो कुछ भी वे चाहते हैं। इसे रोकने के लिए, TEdit नियंत्रण के प्रकाशित गुण सीमित करने पर विचार:

unit MyPanelEdit; 

interface 

uses 
    DesignEditors, Unit2, DesignIntf, SysUtils, Classes, TypInfo, StdCtrls; 

type 
    TEditProperty = class(TComponentProperty) 
    private 
    function FilterFunc(const ATestEditor: IProperty): Boolean; 
    public 
    function GetAttributes: TPropertyAttributes; override; 
    procedure GetProperties(Proc: TGetPropProc); override; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterPropertyEditor(TypeInfo(TEdit), TMyPanel, '', TEditProperty); 
end; 

{ TEditProperty } 

function TEditProperty.FilterFunc(const ATestEditor: IProperty): Boolean; 
begin 
    Result := ATestEditor.GetName = 'TabOrder'; 
end; 

function TEditProperty.GetAttributes: TPropertyAttributes; 
begin 
    Result := [paSubProperties]; 
end; 

procedure TEditProperty.GetProperties(Proc: TGetPropProc); 
var 
    LComponents: IDesignerSelections; 
    LDesigner: IDesigner; 
begin 
    LComponents := GetSelections; 
    if LComponents <> nil then 
    begin 
    if not Supports(
     FindRootDesigner(LComponents[0]), IDesigner, LDesigner) then 
     LDesigner := Designer; 
    GetComponentProperties(LComponents, [tkInteger], LDesigner, Proc, 
     FilterFunc); 
    end; 
end; 

end. 

यह प्रकाशित TEdit गुण के गुणों की सीमा केवल TabOrder दिखाने के लिए।

+0

धन्यवाद! मुझे यकीन नहीं है कि वास्तव में समस्या क्या थी, लेकिन अब यह काम करता है और यह एक बहुत अच्छा जवाब है! +1 और स्वीकार किया गया। – jpfollenius

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