2009-04-20 107 views
4

在代碼中,我在幾年前開發的,我一直用這個有很多收在任何時刻按下Esc鍵的當前形式:如何在TEdit集中時避免按下Escape時的叮聲?

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if key = #27 then close; 
end; 

此行爲是TForm的定義。表單的KeyPreview屬性設置爲True,以使表單在任何其他組件之前對按鍵進行響應。對於程序的最佳部分,它都可以很好地工作,但是,如果在TEdit組件聚焦時按下Escape鍵,則發出聲音(Windows使用聲音表示無效操作)。它仍然正常工作,但我從來沒有完全擺脫聲音。

這是什麼問題?


步驟重新創建:

  • 新的VCL Forms應用程序,設置窗體的的KeyPreview真
  • 事件選項卡上雙擊onkeypress事件事件並輸入虛擬代碼:

    if key =#27 then;

  • 添加的TListBox,TCheckBox,TEDIT的形式和運行應用程序的應用

  • 試着同時按下Esc鍵沒有反應,由僞代碼
  • 重點TEDIT和按Esc鍵指定。沒有任何反應,但播放的聲音。

回答

20

由於您在輸入中保留了ESC,您將得到ding。看看密鑰是如何被var?將其設置爲#0並消除叮。這將其從進一步處理中移除。

procedure TSomeForm.FormKeyPress(Sender: TObject; var Key: Char); 
begin 
    if key = #27 then 
    begin 
     key := #0; 
     close; 
    end; 
end; 

KeyPreview就是這樣,預覽將傳遞給控件的內容,除非您停止它。

+0

這讓我無語了...我已經破解了更堅韌的堅果,但是這... aaaahhhh。感謝您的建議。多謝。 – 2009-04-20 21:54:39

+0

它發生在我們所有人身上。任何時候,我都會在一段時間內與一個bug進行鬥爭,但我知道它會變得非常簡單。這只是它的工作方式。 – 2009-04-20 22:38:35

0

這是一個古老的線程...但無論如何,這裏是一個更好的:捕獲Alt-C

與ESC不同,Alt-C沒有被KeyPress服務,因此在KeyPress中將Key設置爲#0不起作用,而可怕的「ding!」每次發佈。 經過數小時的嘗試,這裏是我找到的解決方法: - 創建一個主菜單選項服務於請求 - 將其快捷方式設置爲Alt + C - 是的,這不是可用的快捷方式選項之一。 )...但它確實工作! - 在該菜單選項的OnClick 中執行處理 - 甚至可以在「後臺」中進行處理:您可以將菜單選項的可見性設置爲false - 只要其Enabled保持爲真,它將由Alt-C甚至儘管它在菜單中不可見。

希望可以幫助!如果你有更優雅的東西,請告知。

相關問題