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

關於KeyDown事件的疑問

尚未結案
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-26 15:57:46 IP:163.28.xxx.xxx 未訂閱
各位大大好: 不知道這問題發表在這裡適不適當 若有錯誤~還請見諒 小弟一直對一事不解 一個視窗程式中,應該是有一個物件是被focus的狀態下 例如:當游標處於一個Edit中時,此Edit應該是處於Focused狀態下 因此按下鍵盤時引發的是Edit中的KeyDown事件 而不是Form中的KeyDown事件,而如果想引發Form上的KeyDown事件 則應該點一下Form,才去按按鍵,不知道這觀念是否正確? 假設上面無誤的話,若今日有一個Form其中有一將整個Form蓋住的 Image物件,而執行程式時,發覺按下按鍵,Form的KeyDown事件並未 被引發,那請問要如何才能將Focus轉回主Form上,使KeyDown事件 能正確的被引發呢?
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-26 16:29:29 IP:210.66.xxx.xxx 未訂閱
如果你要使Form中的KeyDown事件先驅動,請將Form的KeyPreview設為True Ian
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-26 17:00:17 IP:163.28.xxx.xxx 未訂閱
可是這是在Form的KeyPreview已設為True的情形下測試 仍然無法驅動KeyDown的事件 但是如果在Form中設定一個Button 然後將Button的Click事件設為將該Button的Enabled設為False 則可以順利引發Form的KeyDown事件 此現在令小弟非常不解><
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-26 17:19:55 IP:210.66.xxx.xxx 未訂閱
我有一個疑問,你的Image物件是TImage嗎?如果是的話,TImage不是繼承TWinControl,故Form之Focus不會在TImage上,而且TImage也沒有KeyDown事件吧?還是你是用其他之物件呢???? Ian
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-26 17:40:05 IP:163.28.xxx.xxx 未訂閱
在正式的程式中,主Form上有一個TLabel,2個TImage,和MainMenu TForm.OnKeyDown中寫入ShowMessage('GOOD')做測試 結果:執行時按任何按鍵無效 如果再加入一個Button後如上述作設定後 結果:執行時按任何按鍵無效,但按下Button後再按任意鍵就會引發TForm.KeyDown事件,但關掉MessageBox後,KeyDown事件又失效了 持續不解中... 發表人 - DoubleFish2004 於 2004/05/26 17:44:22
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-26 18:00:44 IP:61.221.xxx.xxx 未訂閱
DoubleFish2004 你好:  
引言: 假設上面無誤的話,若今日有一個Form其中有一將整個Form蓋住的 Image物件,而執行程式時,發覺按下按鍵,Form的KeyDown事件並未 被引發,那請問要如何才能將Focus轉回主Form上,使KeyDown事件 能正確的被引發呢?
請在 TForm.OnKeyDown裡面加上 if (( ActiveControl is TImage) then ShowMessge('OK');
------
======================
昏睡~
不昏睡~
不由昏睡~
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-26 18:42:10 IP:163.28.xxx.xxx 未訂閱
感謝ko大大的回答 可是ActiveControl是TWinControl類型 而TImage物件應該無法與它做比較 編譯時也出現了Incompatible types的問題
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-27 08:45:50 IP:210.66.xxx.xxx 未訂閱
DoubleFish2004!我照你說的方法去做,因為你用的TImage、TMainMenu及TLabel均不屬於TWinControl,所以Form.Preview不需設True就可驅動KeyDown事件了,你可以把你的程式碼PO上來嗎? Ian
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-27 08:56:25 IP:163.28.xxx.xxx 未訂閱
我其實很想把我的程式碼Po上來 可是因為是個有點規模的小遊戲 加上小弟我程式設計技巧有待加強 程式碼實在有龐雜加冗長,不知道PO哪部份比較好 不過小弟用了一個暴力法解決了這個問題 也就是用了一個大小為0的edit 將KeyDown事件寫入edit的OnKeyDown中 當要驅動KeyDown事件時就先執行edit.setFocus 這樣就能順利驅動事件了,不過這方法很沒概念說^^"" 小弟才疏學淺~多多見諒~ 也多謝l630521,ko大大的熱心解答
l630521
資深會員


發表:15
回覆:349
積分:372
註冊:2003-02-17

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-27 09:16:37 IP:210.66.xxx.xxx 未訂閱
真是可惜,我也覺得很納悶,想知道是為什麼無法驅動KeyDown事件,雖然是繞了一圈,不過只要能解決問題就可以了.... Ian
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-27 11:46:01 IP:211.22.xxx.xxx 未訂閱
您好: 雖已結案但可參考此篇http://delphi.ktop.com.tw/topic.php?topic_id=23344希望有幫助 ~~應無所住而生其心~~
DoubleFish2004
一般會員


發表:6
回覆:12
積分:3
註冊:2004-05-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-27 13:19:42 IP:211.76.xxx.xxx 未訂閱
感謝terrychen大大的幫忙 不過大概瀏覽過那篇文章的內容後 發覺上面主要的問題都在於TWinControl類型物件的順序問題 也就是最後面的會被程式自動Focus 例如Button,Edit,Memo等這類物件屬於TWinControl 但令小弟疑惑的卻是在我的FORM上沒有任何的TWinControl物件 為何還無法引發主Form的KeyDown事件 不曉得有沒有辦法可以查詢到目前主Form的Focus是在哪個物件的方法..
系統時間:2024-05-17 20:07:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!