線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2335
推到 Plurk!
推到 Facebook!

如何利用TMessage取得KeyDown事件中的Key值

答題得分者是:Justmade
skurama
中階會員


發表:88
回覆:127
積分:73
註冊:2002-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-25 18:40:00 IP:61.219.xxx.xxx 未訂閱
請問,目前我繼承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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-25 20:21:33 IP:218.16.xxx.xxx 未訂閱
procedure MYKeyDown(var msg : TWMKeyDown); message WM_KEYDOWN; procedure TMyEdit.MYKeyDown(var msg: TWMKeyDown); begin showmessage(Char(msg.charcode)); end;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-25 22:12:05 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-26 22:31:48 IP:61.56.xxx.xxx 未訂閱
謝謝!!    改過之後的確可以取得鍵盤的值, 可是不管大小寫的a,他的Ascii好象都是65, 不過因為我只要判斷輸入的是否為數字, 所以沒有太大的影響。    感謝,justmade大大和timhuang大大, justmade大大的解答真是簡潔有力, timhuang大大的解答更是詳細, 只可惜只能給一個人得分。    真的謝謝~~~ ---------------- 初出芧房程設師, 左鍵右鼠寫程式, 日扣夜寫眼框溼, 望能早成系分師。 ----------------
------
----------------
初出芧房程設師,
左鍵右鼠寫程式,
日扣夜寫眼框溼,
望能早成系分師。
----------------
系統時間:2024-05-14 16:01:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!