如何利用TMessage取得KeyDown事件中的Key值 |
答題得分者是:Justmade
|
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
請問,目前我繼承TEdit元件,
要做一個只能輸入數字(暫時做到這個就好),
目前用攔截訊息的方式,宣告如下 procedure MYKeyDown(var msg : TMessage); message WM_KEYDOWN; procedure TMyEdit.MYKeyDown(var msg: TMessage);
begin
showmessage('Test');
end; 之後拉到表單時,在元件按任意鍵是可以顯示Test,
但是我該如何判斷使用者按下的key是什麼Key。 目前知道有取代原onKeyDown的方法, procedure TMyEdit.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState)
begin
......
end; 在Create事件中加上 self.onKeyDown = newKeydown
可是之前有網友說不要如此寫比較好 請問用TMessage有辦法捉到目前的Key值嗎? ----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
------
---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ---------------- |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
hi, 你可以試著追一下程式碼, TEdit 的 onKeyDown event 是由 TWinControl 來的, 所以你查一下 TWinControl class 會發現其攔截 WM_KEYDOWN 是在這裡:
// controls.pas 中 procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; //.. implement procedure TWinControl.WMKeyDown(var Message: TWMKeyDown); begin if not DoKeyDown(Message) then inherited; end;有沒有注意到其將攔下來的 message 是 TWMKeyDown 再查一下該類別的定義為: // message.pas 中 TWMKeyDown = TWMKey; TWMKey = packed record Msg: Cardinal; CharCode: Word; Unused: Word; KeyData: Longint; Result: Longint; end;這樣就可以看得到其代表的資料了, 其中的 CharCode 就是原來 edit 中的 onKeyDown event 中的 var Key: Word 了. 所以將你的程式修改一下: procedure TMyEdit.MYKeyDown(var msg: TMWKeyDown); begin showmessage(inttostr(msg.CharCode)); end;就可以了!! |
skurama
中階會員 發表:88 回覆:127 積分:73 註冊:2002-07-22 發送簡訊給我 |
謝謝!! 改過之後的確可以取得鍵盤的值,
可是不管大小寫的a,他的Ascii好象都是65,
不過因為我只要判斷輸入的是否為數字,
所以沒有太大的影響。 感謝,justmade大大和timhuang大大,
justmade大大的解答真是簡潔有力,
timhuang大大的解答更是詳細,
只可惜只能給一個人得分。 真的謝謝~~~ ----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
------
---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ---------------- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |