Intercept TAB key in RichEdit

delphi, delphi-xe, vcl

Solution

Use the `OnKeyPress` event instead:

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

Alternatively, if you really need to use the `OnKeyDown` event, simply remove the key messages:

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;

Problem

There are lot of similar questions on here, but I couldn't find an answer for my problem. I have a `TRichEdit` and want to implement some custom behaviour when the user presses Tab. I set the rich edit's `WantTabs` property to `True` and tried to add my custom behaviour in `OnKeyDown`, which works fine, but unfortunately after that the "normal" tab behaviour is executed as well (inserting a tab character in the edit). I tried setting `Key` to `0` in the event handler but that doesn't help. How can I prevent the "normal" tab behaviour from being executed?

Original source