2011-08-18 96 views
3

這裏有很多類似的問題,但我找不到我的問題的答案。在RichEdit中攔截TAB鍵

我有一個TRichEdit並希望實施一些自定義行爲,當用戶按選項卡。我將富編輯的WantTabs屬性設置爲True,並嘗試將OnKeyDown中的自定義行爲添加到工作狀態,但不幸的是在此之後「標準」選項卡行爲也被執行(在編輯中插入製表符)。我嘗試在事件處理程序中將Key設置爲0,但這沒有幫助。

如何防止執行「正常」選項卡行爲?

回答

6

使用OnKeyPress事件,而不是:

procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); 
begin 
    if Key = chr(VK_TAB) then 
    begin 
    beep; 
    Key := #0; 
    end; 
end; 

或者,如果你真的需要使用OnKeyDown事件時,只要將關鍵信息:

procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
var 
    msg: TMsg; 
begin 
    if Key = VK_TAB then 
    begin 
    beep; 
    while PeekMessage(msg, RichEdit1.Handle, WM_KEYFIRST, WM_KEYLAST, 
     PM_REMOVE) do; 
    end; 
end; 
+0

+1非常感謝你,那工作!所以,'OnKeyPress'和'OnKeyDown'之間似乎有一些根本區別。你能解釋一下這是什麼嗎? – jpfollenius

+0

@Smasher:這是插入角色的按鍵。 (如果你按'VK_RIGHT',你確實得到了一個鍵和一個鍵(當然),但沒有按鍵,因爲沒有在控制中插入'VK_RIGHT'字符。) –

+0

這很有道理,謝謝您! – jpfollenius