问题 拦截TAB键并禁止它


我需要拦截TEdits上的TAB键盘笔划并以编程方式抑制它们。 在某些情况下,我不希望焦点转移到下一个控件。

我尝试在TEdit级别和TForm上使用KeyPreview = true处理KeyPress,KeyDown。 我偷看了以下建议:

但它没有用。 事件被触发,比方说,输入键但不是TAB键。

我正在使用Delphi 7。 谢谢你的帮助。


4935
2018-05-06 11:07


起源

他们没有被解雇,因为 TABkey是将焦点移动到下一个控件的键,因此它具有特殊处理。 - TLama
谢谢TLama。解释了这种行为。所以你认为,有逃生途径吗? - Jako
delphi.about.com/cs/adptips2002/a/bltip0702_5.htm


答案:


如果你想拦截TAB键行为,你应该抓住 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.

16
2018-05-06 11:18



亲爱的TLama,这非常完美。最好的剪切和粘贴;) - Jako