2010-05-12 9 views
5

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

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

+0

क्या आप कुछ कोड दिखा सकते हैं? मैं सोच रहा हूं कि आपको टीकंट्रोल से विरासत में मिला है, टीसी कस्टमकंट्रोल नहीं ... (टीकंट्रोल एक TWINControl नहीं है, इसमें विंडो हैंडल नहीं है और इनपुट फोकस नहीं ले सकता - सोचें: TLabel) –

+0

यह TCustomControl से प्राप्त होता है। –

उत्तर

7

कुछ बातें की कोशिश करने के लिए:

  • MouseDown पर, फोन Windows.SetFocus(Handle)। मेरे अनुभव में, WinAPI फ़ंक्शन SetFocus अक्सर वीसीएल की SetFocus विधि से बेहतर काम करता है।
  • WM_GETDLGCODE संदेश के जवाब में, Message.Result := Message.Result or DLGC_WANTCHARS or DLGC_WANTARROWS or DLGC_WANTTAB or DLGC_WANTALLKEYS के साथ उत्तर दें;
+0

धन्यवाद। यह या तो तुम्हारा या लार्स स्वीकार करता था, क्योंकि आप दोनों को माउसडाउन के अंदर सेटफोकस डालने का जवाब था, और यह काम करता था। मैंने WM_GETDLGCODE चीज़ की वजह से आपका चयन किया, जिसे मैंने विशेष रूप से तीर कुंजियों को फंसाने की आवश्यकता होने के बाद भी आवश्यकता समाप्त कर दी। –

+0

क्या सिर्फ 'DLGC_WANTALLKEYS' के लिए पूछना पर्याप्त नहीं है? –

+0

@ डेविड: नहीं, यह नहीं है। –

0

क्या कुंजीस्ट्रोक फॉर्म स्तर पर उपलब्ध है? यही है, KeyPreview चालू है, और क्या आप फॉर्म के ऑनकेप्रेस ईवेंट में कीस्ट्रोक देख सकते हैं? आप डीबगर में वहां से इसका अनुसरण कर सकते हैं। कुंजीपटल इनपुट के लिए उपयुक्त नियंत्रण (दान के रूप में इंगित) है? उदाहरण के लिए, एक TLabel, हालांकि यह पाठ प्रदर्शित करता है, एक ग्राफिकल नियंत्रण है।

1

मैंने अपने नियंत्रण के लिए कोड चेक किया है और मैं ऐसा कुछ भी नहीं देख सकता जो इस काम को रोक सकता है। क्या आप प्रक्रिया प्रक्रिया में "विरासत" को बुला रहे हैं?

procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; 
procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; 
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 

procedure KeyDown(var Key: Word; Shift: TShiftState); override; 
2

आप WS_TABSTOP से सेट किया है:

मैं निम्नलिखित, लेकिन कुछ भी विशेष संभाल करते हो? इसके बिना आपके पास इनपुट फोकस नहीं है, मुझे विश्वास है। लेकिन यह लगभग 10 साल पहले एक याद पर आधारित है, जब मैं अपना खुद का वाक्यविन्यास-हाइलाइटिंग कोड संपादक लिख रहा था, जिसके लिए मैंने स्रोत खो दिया है।

{TWinControl.}TabStop := True; करना चाहिए। TWinControl से व्युत्पन्न एक डू-कुछ घटक वाला एक त्वरित परीक्षण ऐप और महत्वपूर्ण घटनाओं के लिए एक संवाद प्रदर्शित करने से यह पता चलता है कि यह सभी अंतर बनाता है।

+0

बस कोशिश की, और यह कुछ भी बदलने के लिए प्रतीत नहीं होता है। मुझे अभी भी कीबोर्ड फोकस नहीं मिल सकता है। –

4

क्या यह माउस पर सेटफोकस को कॉल करने जितना आसान हो सकता है?

procedure TYourCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); 
begin 
    inherited; 

    if CanFocus then 
    SetFocus; 
end; 
+0

मुझे दृढ़ विश्वास है कि यह मुद्दा है। –