2012-05-06 47 views
11

Necesito interceptar el trazo del teclado TAB en TEdits y suprimirlos programáticamente. En ciertos casos, no quiero que el foco cambie al siguiente control.Interceptar la tecla TAB y suprimirla

Intenté manejar KeyPress, KeyDown en el nivel TEdit y en TForm con KeyPreview = true. He asomé consejos de:

Pero no funcionó. Los eventos se activan para, digamos, la tecla Intro PERO no para la tecla TAB.

Estoy usando Delphi 7. Gracias por su ayuda.

+0

No se disparan porque el 'TAB'key está destinada a ser la llave que mueve el foco al siguiente control , por lo tanto, tiene un manejo especial. – TLama

+1

Gracias TLama. El comportamiento es explicado. Entonces, ¿crees que hay una ruta de escape? – Jako

+1

http://delphi.about.com/cs/adptips2002/a/bltip0702_5.htm –

Respuesta

16

Si desea interceptar el comportamiento de la tecla TAB, debería ver el mensaje CM_DIALOGKEY. En este ejemplo, si se establece la YouWantToInterceptTab valor booleano True, la clave TAB se va a consumir:

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. 
+2

Querido TLama, esto funcionó perfectamente. Mejor cortar y pegar alguna vez;) – Jako

Cuestiones relacionadas