Перехватить TAB-ключ и подавить его

Мне нужно перехватить такт клавиатуры TAB на TEdits и подавить их программно. В некоторых случаях я не хочу, чтобы фокус изменился на следующий элемент управления.

Я попытался обработать KeyPress, KeyDown как на уровне TEdit, так и на TForm с KeyPreview = true. Я заглянул в совет:

Но это не сработало. События активируются, скажем, клавишей Enter, но не для клавиши TAB.

Я использую Delphi 7. Благодарим за помощь.

Ответ 1

Если вы хотите перехватить поведение клавиши TAB, вы должны поймать сообщение CM_DIALOGKEY. В этом примере, если вы установите значение YouWantToInterceptTab boolean равным True, клавиша TAB будет съедена:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
  private
    YouWantToInterceptTab: Boolean;
    procedure CMDialogKey(var AMessage: TCMDialogKey); message CM_DIALOGKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMDialogKey(var AMessage: TCMDialogKey);
begin
  if AMessage.CharCode = VK_TAB then
  begin
    ShowMessage('TAB key has been pressed in ' + ActiveControl.Name);

    if YouWantToInterceptTab then
    begin
      ShowMessage('TAB key will be eaten');
      AMessage.Result := 1;
    end
    else
      inherited;        
  end
  else
    inherited;
end;

end.