拦截RichEdit中的TAB键

3
这里有很多类似的问题,但我找不到解决我的问题的答案。
我有一个TRichEdit并想要在用户按下Tab键时实现一些自定义行为。我将rich edit的WantTabs属性设置为True,并尝试在OnKeyDown事件中添加自定义行为,这可以正常工作,但不幸的是,在此之后,“正常”的tab行为也会执行(在编辑中插入制表符)。我尝试在事件处理程序中将Key设置为0,但没有帮助。
我该如何防止执行“正常”的tab行为?
1个回答

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;

+1 非常感谢,这个方法很有效!所以,OnKeyPressOnKeyDown之间似乎存在一些根本性的差异。你能解释一下是什么吗? - jpfollenius
@Smasher:是按键操作插入字符。(如果您按下 VK_RIGHT,您会得到一个按下和一个松开的操作(当然),但没有按键操作,因为没有将 'VK_RIGHT 字符' 插入控件。) - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接