Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Capturar la tecla TAB

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Capturar la tecla TAB Responder citando

¡Hola a tod@s!

¿Alguien sabe cómo se captura el tabulador?

Con el evento KeyDown soy capaz de capturar cualquier tecla, pero el TAB no pasa por ningún evento de tecla (KeyDown, KeyPress, ...) o, si pasa, se salta a la torera el punto de ruptura (breakpoint) que pongo.
A ver si hay suerte o, en su defecto, un alma caritativa. Salu2 Wink

Volver arriba
Mensaje    Asunto: Capturar la tecla TAB Responder citando

Muchas gracias _Leo. Funciona perfectamente.
Wink
Ahora bien, ¿te importaría explicarme que he añadido a mi aplicación? Porque, ya te digo, funcionar funciona pero no tengo ni puñetera idea de que es lo que he hecho.
He buscado en la ayuda la clase TCMDDialogKey pero no viene nada.
Tampoco entiendo por qué funciona el poner en la parte "private" el desarrollo de una función, sin prototipo ni nada.
Lo de BEGIN_MESSAGE_MAP lo he mirado en la ayuda de VB6 y, entiendo, que sirve para poder capturar cualquier mensaje que reciba la aplicación o, mejor dicho, el formulario donde lo he puesto. ¿No se puede hacer lo mismo con GetMessage? ¿o hay diferencias?

Ya se que son muchas preguntas. Si puedes (y te apetece) te agradecería que me aclarases estas dudas.
Salu2 y gracias.

Volver arriba
Mensaje    Asunto: Capturar la tecla TAB Responder citando

Prueba con lo siguiente en la parte privada de la clase del form por ejemplo:

...
private: // User declarations

  void __fastcall CmDialogKey(TCMDialogKey& msg)
  {
      if ( msg.CharCode == VK_TAB )
          ShowMessage("se pulso tab");
      // Si queremos que el mensaje siga su curso normal
      //   añadimos la linea siguiente, sino la quitamos
      TForm::Dispatch( &msg );
  }

  BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(CM_DIALOGKEY, TCMDialogKey, CmDialogKey)
  END_MESSAGE_MAP(TForm)

...

Volver arriba
Mensaje    Asunto: Capturar la tecla TAB Responder citando

A veces es más útil curiosear en las cabeceras o en los fuentes de la VCL, ya que el fuerte de Borland esta claro que no es documentar.

Si miras en la cabecera "Controls.hpp" veras que TCMDialogKey no es más que un typedef de TWMKey y el mensaje CM_DIALOGKEY que estamos interceptando y que no tiene equivalente en el API recibe las pulsaciones de teclas especiales.

Lo de que vaya en la parte privada o que el código vaya en la misma cabecera no es obligación, solo lo hago en los ejemplos normalmente por abreviar ya que no se trata de explicar nada sobre el lenguaje.

BEGIN_MESSAGE_MAP es una de las diferentes maneras para capturar un mensaje en una aplicación que hace uso de la VCL, también podemos capturar los mensajes en la cola principal en el evento OnMessage de TApplication o en WndProc de cada ventana.

En una aplicación estándar de Windows que no use ninguna librería de ventanas esta claro que podemos capturar todas las teclas incluido TAB y somos nosotros los que decidimos pasar o no la pulsación a los distintos controles. Pues esto es lo que ocurre en la VCL, que hace esto por nosotros...

Por tanto si queremos capturar las teclas antes de que la VCL haga ese trabajo por nosotros tenemos que hacerlo en la cola principal o bien usar el método anterior que prevee la librería:

Declaramos e implementamos la función siguiente:

  void __fastcall TForm1::ApplicationMessages(tagMSG &Msg, bool &Handled)
  {
      if ( Msg.message==WM_KEYDOWN && Msg.wParam==VK_TAB )
      {
          ShowMessage("se pulso tab");
          // Si no queremos dejar pasar la pulsación
          // de esta tecla ponemos Handle a true
          Handled = true;
      }
  }

y en el constructor del Form la siguiente línea:

  Application->OnMessage = ApplicationMessages;

Volver arriba
Mensaje    Asunto: Capturar la tecla TAB Responder citando

PLAS, PLAS, PLAS, ..... (un aplauso)

Salu2
KAYETANO

Volver arriba
Mensaje    Asunto: Capturar la tecla TAB Responder citando

¡jooooooder! me uno enérgicamente al aplauso de Kayetano. ¡Vaya explicación! Así da gusto. De verdad, te agradezco que hayas respondido. No solo me has aclarado las dudas, sino que me has "abierto las miras". Ahora empiezo a comprender unas cuantas cosas.
Sigue así, tronco. No cambies.
Wink
Volver arriba
Mensaje    Asunto: aplausos tb por mi parte Responder citando

Leo, ere un fiera, por cierto, que tengo algo que me ha dado un trabajo que no veas con esto del ENTER (que no lo detectaba) y al final he optao por pillar el TAB este que explicas....

Gracias Leo, por cierto que te queria enseñar lo del browser ripper (partiendo de las modificaciones del archivo de la Bass 2.0 para grabar Mp3)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.