आपके घटक के भीतर उन नेस्टेड नियंत्रणों का टैब ऑर्डर उस फ़ॉर्म के टैब ऑर्डर से अलग है जिस पर आपका घटक रहता है। फ़ॉर्म की टैब ऑर्डर सूची में घटक का टैब ऑर्डर तब होता है जब आप नेस्टेड कंट्रोल पर टैब करते हैं। एक बार सभी टैब क्रम सूचियों संयुक्त, वे अंतिम चक्र में परिणाम:
- फार्म पर एक नियंत्रण (
TabOrder=0
)
- दूसरा रूप पर नियंत्रण (
TabOrder=1
)
- आपका पैनल घटक (
TabOrder=2
)
- 1 संपादित करें (
TabOrder=0
)
- 2 संपादित करें (
TabOrder=1
)
- फार्म पर एक और नियंत्रण (
TabOrder=3
)
पैनल घटक डिजाइन समय की टैब क्रम सेट करने में सक्षम होने के लिए:
रनटाइम पर यह हमेशा के बाद से 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
दिखाने के लिए।
क्या आप अपने घटक के निर्माता में टैब ऑर्डर सेट नहीं कर सकते हैं? –
@ डेविड हेफरनन नहीं क्योंकि आसपास के रूप में टैब ऑर्डर समस्या है। – jpfollenius
मेरी धारणा यह है कि दो संपादन नियंत्रण पैनल के बच्चे हैं। क्या यह मामला नहीं है? –