Перехватить клавишу TAB и подавить ее

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

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

Intercept TAB key in RichEdit How do I make the TAB key close a TComboBox without losing the current position?

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

Я использую Delphi 7. Спасибо за вашу помощь.

 user49673606 мая 2012 г., 13:18
 Jako06 мая 2012 г., 13:15
Спасибо TLama. Поведение объясняется. Так ты думаешь, есть ли выход?
 TLama06 мая 2012 г., 13:11
Они не уволены, потому чтоTABключ предназначен для того, чтобы перемещать фокус на следующий элемент управления, поэтому он имеет специальную обработку.

Ответы на вопрос(1)

Решение Вопроса

CM_DIALOGKEY сообщение. В этом примере, если вы установитеYouWantToInterceptTab логическое значение 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.
 Jako07 мая 2012 г., 08:34
Уважаемый TLama, это сработало просто отлично. Лучшая вырезка и вставка когда-либо;)

Ваш ответ на вопрос