2012-05-06 5 views
11

Devo intercettare il tocco della tastiera TAB su TEdits e sopprimerli a livello di programmazione. In alcuni casi, non desidero che lo stato attivo cambi al controllo successivo.Intercettare il tasto TAB e sopprimerlo.

Ho provato a gestire KeyPress, KeyDown sia su livello TEdit che su TForm con KeyPreview = true. Ho sbirciato consigli da:

Ma non ha funzionato. Gli eventi vengono attivati ​​per, diciamo, il tasto Invio MA non per il tasto TAB.

Sto usando Delphi 7. Grazie per il vostro aiuto.

+0

Non vengono licenziati perché il 'TAB'key è destinato ad essere la chiave che muove attenzione al controllo successivo , quindi ha una gestione speciale. – TLama

+1

Grazie TLama. Il comportamento è spiegato. Quindi pensi che ci sia una via di fuga? – Jako

+1

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

risposta

16

Se si desidera intercettare il comportamento del tasto TAB, è necessario prendere il messaggio CM_DIALOGKEY. In questo esempio, se si imposta il YouWantToInterceptTab valore booleano su True, la chiave TAB sarà mangiato:

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

Cara TLama, ha funzionato perfettamente. Il miglior taglio e incolla di sempre;) – Jako