Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Códigos escape y virtual Keys Codes (https://www.clubdelphi.com/foros/showthread.php?t=32395)

Cabanyaler 05-06-2006 09:12:14

Códigos escape y virtual Keys Codes
 
Hola amigos.

Estoy intentando capturar si se pulsa la tecla TAB del teclado, pero no lo logro aún habiéndome estudiado la ayuda y consultando foros. Incluyendo este:

http://www.clubdelphi.com/foros/show...codigos+escape


Normalmente con la tecla Intro, lo he hecho del siguiente modo:

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
      if(Key=#13) THEN
         SHOWMESSAGE('INTRO')
      ELSE
         SHOWMESSAGE('???')
end;

... y me funciona de maravilla, pero si intento lo mismo para la tecla TAb, no me funciona.

Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
      if(Key=#9) THEN
         SHOWMESSAGE('TAB')
      ELSE
         SHOWMESSAGE('???')
end;

También he probado para ver cual es el texto que me saldría, por si acaso no devolvía exactamente ese texto, pero me imprime blanco con el siguiente código.

Código Delphi [-]
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if(Key=VK_TAB) THEN
           SHOWMESSAGE(WORDTOSTR(KEY))
        ELSE
           SHOWMESSAGE(WORDTOSTR(KEY))
end;

¿Alguien me podría decir como trabajar con las Virtual Keys Codes?. El fin es cuando pulse una determinada tecla de este tipo como (Tab, Esc, intro) realizar el evento que desee. Si sirve para algo... trabajo con D6 y WXP.

Gracias a todos.

seoane 05-06-2006 12:15:43

El problema es que windows no llega a enviar la tecla TAB al edit, ya se encarga el de procesarla. Para prevenir esto, windows primero manda el mensaje WM_GETDLGCODE al control preguntando entre otras cosas si quiere que sea windows el que se encargue de la tecla o prefiere ser el.

Pues bien, seguramente habra alguna forma mas sencilla de hacer esto, y aqui hay expertos suficientes para corregirme ;) , pero esta solucion me parece interesante. Vamos a hacer que todos los edit del formulario acepten la tecla TAB.

Código Delphi [-]
type
  // Aqui esta la clave, cambiamos la forma de procesar este mensaje
  // Ojo, tiene que estar antes de la definicion de TForm1
  TEdit = class(StdCtrls.TEdit)
  private
    procedure WMGETDLGCODE(var Msg: TMessage); message WM_GETDLGCODE;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Aqui procesamos el mensaje
procedure TEdit.WMGETDLGCODE(var Msg: TMessage);
begin
  inherited;
  Msg.Result:= Msg.Result or DLGC_WANTTAB;
end;

// Esto es solo una prueba para comprobar que funciona bien
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_TAB then ShowMessage('VK_TAB');
end;

Cabanyaler 05-06-2006 16:13:13

:p Muchas gracias.
Funciona de maravilla.
Vamos un paso más allá.

Si ahora lo quiero hacer sobre las casillas de un TDBGrid???

He comprobado que.... es así :

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TNSDBdbgrid = class(tdbgrid)
  private
    procedure WMGETDLGCODE(var Msg: TMessage); message WM_GETDLGCODE;
  end;



  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Table1: TTable;
    Table1COD_ART: TStringField;
    Table1DES_ART: TStringField;
    procedure FormActivate(Sender: TObject);
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TNSDBdbgrid.WMGETDLGCODE(var Msg: TMessage);
begin
  inherited;
  Msg.Result:= Msg.Result or DLGC_WANTTAB;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
    Table1.Open;
end;

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if Key = VK_TAB then ShowMessage('VK_TAB');
end;

end.

Gracias.


La franja horaria es GMT +2. Ahora son las 13:22:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi