2009-12-22 11 views
10

मुझे एक विचित्र छोटा ऐप मिला है जो डेल्फी में लिखे गए स्क्रीन नंबरपैड/कैलकुलेटर पर पॉप अप करता है। मैं इसे बनाना चाहता हूं ताकि अगर आप 'एंटर' दबाएं (संख्या पैड पर) तो आप '=' दबाएंगे और यदि आपने 'रिटर्न' दबाया है (मुख्य कीबोर्ड पर) तो आप 'ओके' दबाएंगे।डेल्फी: क्या मैं numpad की एंटर कुंजी और कैरिज रिटर्न के बीच अंतर कर सकता हूं?

एक ठीक बटन है जो फ़ॉर्म का डिफ़ॉल्ट व्यक्ति है जो प्रवेश या वापसी पर क्लिक करने का जवाब देता है। एक ऑनकीडाउन इवेंट हैंडलर भी है जो संभावित रूप से दोनों को कैप्चर कर सकता है और vk_return के रूप में वापस आ सकता है। लेकिन इसके कर्तव्यों को डिफ़ॉल्ट 'ओके' बटन द्वारा उपयोग किया जाता है।

अगर मैं रिटर्न और एंटर के बीच का अंतर जान सकता हूं, तो मैं ठीक बटन पर अपनी डिफ़ॉल्ट संपत्ति से छुटकारा पा सकता हूं और फॉर्म बटन के नीचे ओके बटन के क्लिक इवेंट हैंडलर को हिट कर सकता हूं, लेकिन हां वे दोनों हैं VK_RETURN।

उत्तर

17

WM_KEYDOWN संदेश हैंडलर ओवरराइड:

procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; 

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

procedure TForm1.WMKeyDown(var Message: TWMKeyDown); 
const 
    // Message.KeyData format: 
    // [0..15 repCount][16..23 scan code][24 extended bit][25..28 reserved] 
    // [29 context][30 previous state][31 transition state] 
    KD_IS_EXTENDED = 1 shl 24; 
begin 
    if Message.CharCode <> VK_RETURN then 
    begin 
    inherited; 
    Exit; 
    end; 
    if (KD_IS_EXTENDED and Message.KeyData) <> 0 then 
    ShowMessage('Keypad Enter') 
    else 
    ShowMessage('Return'); 
end; 
संबंधित मुद्दे