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 

KeyDown KeyUp y VK_TAB

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: KeyDown KeyUp y VK_TAB Responder citando

Pues me pasa que esto:

if(Key == VK_TAB) Edit1->Color = clRed;

Solo me funciona en el evento KeyUp y no en el KeyPress o en el KeyDown. ¿Que puede ser?.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Fijate que con otras teclas anda bien, proba:

if(Key == 'N') Edit1->Color = clRed;

En el caso de la tecla tab pareceria que no genera los otros eventos.
Volver arriba
Mensaje    Asunto: Responder citando

Quizás te sirva esto:

    [Capturar la tecla TAB]
    https://cppbuilder.es/viewtopic.php?t=3386
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:
Quizás te sirva esto:

[Capturar la tecla TAB]
https://cppbuilder.es/viewtopic.php?t=3386


Muchisimas gracias Leo. Lo mejor la explicación. Me has dejado flipao.
Ahora lo que me interesa es aplicar esto a un componente que estoy haciendo a partir de un TCustomEdit. Voy a probarlo ahoria mismo, a ver si lo consigo.
Lo que quiero es que mi componente no responda al TAB mientras que el resto si lo haga.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si lo vas a hacer dentro de tu componente quizás también te sea útil echarle un vistazo a WM_GETDLGCODE.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno, pues no hay manera. Si se pone este codigo en el form funciona correctamente, aunque da un warning.
Pero si lo pongo dentro de la clase del componente derivado del TCustomEdit no hace nada.
He intentado con el otro código, pero TCustomEdit no desciende de TAplicattion así no funciona.
He intentado reescribir el metodo Dispatch del componente y me deja compilarlo sin dar errores pero luego no hay forma de capturar un mensaje.
¿Alguna idea?.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Jopé!. Casi nos chocamos!!!. Ahora mismo voy a mirarlo. Gracias _Leo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No lo consigo. He hecho lo siguiente dentro de mi componente:

protected:

void __fastcall WmGetDlgCode(TWMGetDlgCode& msg)
{
if(msg.Msg == DLGC_WANTTAB)
ShowMessage("se pulso tab");
//else inherited::Dispatch( &msg );
}

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_GETDLGCODE, TWMGetDlgCode, WmGetDlgCode)
END_MESSAGE_MAP(inherited)

(//else inherited::Dispatch( &msg ); si quito // tampoco funciona)
Y no parece funcionar. Además he estado mirando en Controls.hpp y Messages.hpp y encientro que la estructura TWMGetDlgCode es un typedef de TWMNoParams

struct TWMNoParams
{
unsigned Msg;
Word Unused[4];
int Result;
} ;

Y esto si que no lo entiendo. ¿Tengo que hacer la conparación como la he hecho (if(msg.Msg== etc)? .
La verdad es que es un tanto complicadillo el asunto. ¿Alguna sugerencia? y sobre todo ¿algun manual que trate de estas cosas que me puedas recomendar para no dar tanto el coñazo?
Mucha gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si te fijas en la referencia del API no es así como se usa este mensaje, lo que tenemos es que responderle con las cosas que nos interesan, o sea, algo así para decirle que queremos la tecla TAB:
Código:
void __fastcall WmGetDlgCode(TWMGetDlgCode& msg)
{
    // Llamamos al evento en la clase base, tiene
    // que estar "inherited" correctamente declarado
    inherited::Dispatch( &msg );

    // Le decimos que nos interesa el tabulador ademas de
    // lo que haya añadido la llamada anterior a la clase base   
    msg.Result |= DLGC_WANTTAB;
}


Respondiendo al mensaje le indicamos que nos interesa esa tecla, ahora la capturamos en los mensajes relacionados con el teclado.

Aunque es difícil sin ver el código completo y sin saber que es lo que quieres hacer (me refiero al componente completo).

En cuanto a libros no te puedo recomendar uno solo, ya que muchas de estas cosas no las encontraras en libros especialmente dedicados al BCB, si te enseñaran a crear componentes (eso lo encontraras en casi cualquier libro sobre BCB en las ultimas paginas suelen dedicarlo a temas mas avanzados como crear componentes). Pero con eso no esta todo resuelto, ya que lo que se necesita conocer es el API de Windows, al menos lo principal, porque aunque no lo uses directamente sino a través de funciones de la VCL que al fin y al cabo encapsulan el API.

Para conocer la base del API y como funciona Windows, un libro que esta bastante bien:

[Programming Windows de Charles Petzold]
http://www.charlespetzold.com/pw5/index.html

Y para crear componentes, cualquier libro avanzado de BCB. O bien mirando en cualquier buscador hay mucha información, aunque la mayoría para Delphi, pero vamos que si entiendes Pascal es mas o menos lo mismo. Y también ayuda bastante al principio mirar el código fuente de otros componentes.

Y también mucha paciencia, porque si Borland apenas documenta lo que se ve, imagínate lo que no se ve Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_Leo escribió:
Si te fijas en la referencia del API no es así como se usa este mensaje, lo que tenemos es que responderle con las cosas que nos interesan, o sea, algo así para decirle que queremos la tecla TAB:
Código:
void __fastcall WmGetDlgCode(TWMGetDlgCode& msg)
{
    // Llamamos al evento en la clase base, tiene
    // que estar "inherited" correctamente declarado
    inherited::Dispatch( &msg );

    // Le decimos que nos interesa el tabulador ademas de
    // lo que haya añadido la llamada anterior a la clase base   
    msg.Result |= DLGC_WANTTAB;
}


Respondiendo al mensaje le indicamos que nos interesa esa tecla, ahora la capturamos en los mensajes relacionados con el teclado.


O sea ¿es algo así como "activar" esa tecla para este componente?. Dicho de otra forma, ¿que sino hago esta operación el componente no reaccionará en el KeyDown? (lo que le ocurre ahora).
De todas formas en cuanto te acabe de responder me voy de cabeza a esa dirección que me has puesto.

_Leo escribió:
Aunque es difícil sin ver el código completo y sin saber que es lo que quieres hacer (me refiero al componente completo).


Quiero hacer a partir de un TCustomEdit un componente que haga más o menos lo del TEdit, pero sin reaccionar al TAB. Es decir, que cuando el foco llegue a ese objeto en un form, se quede el él hasta que el usuario pulse ENTER. Además quiero que tenga una serie de funcionalidades de manera que me permita hacer búsquedas en una tabla de una BD mediante sentencias SQL. Ya hice algo así en la V.1 y lo colgué en alguna parté del foro. Pero daba algún problema y lo estoy reescribiendo, espero que a mejor.
Y en cuanto al manual, gracias por las recomendaciones, tengo ya manuales de F. Charte pero me saben a poco. ¿Por que no escribes tú uno?. Aqui tienes a un lector/fan asegurado, que iria a la tienda (o a la web) de cabeza a comprarlo. Y puede que el resto del foro vaya detrás.
Smile
En cualquier caso, muchas gracias _Leo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Y por cierto. Este coponente cuando esté acabdo lo colgaré en componentes, a pesar de que parece estar bastante parado el tema.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

OK Ya funciona y hace lo que yo quiero. Muchisimas gracias _Leo.

En cuanto a lo de "fijarme en la API". Soy un borrico y me lo había leído del tirón. Y mi inglés no es tan bueno como para hacer eso. Así que por si acaso a alguno le resulta útil lo he traducido. Puede haber alguna incorreción pero básicamente se entiende (espero):

El mensaje WM_GETDLGCODE es enviado al procedimiento de ventana asociado con un control. Por defecto, el sistema manipula todas las entradas de teclado hacia el control; el sistema interpreta cierto tipo de entradas de teclado como teclas de navegación de los “dialog box”. Para ignorar este funcionamiento el control puede responder hacia el mensaje WM_GETDLGCODE para indicarle los tipos de entrada que se desea procesar por si mismo.

Por otra parte me da un warning, relativo a que se repetira en la compilación en cada objeto. Ya miraré por qué.

Y por si no queda claro; ahora en el evento KeyPress del componente he puesto:
{
if(Key == VK_TAB) Color = clAqua;

if(Key == VK_RETURN) Color = clGreen;

TCustomEdit::KeyPress(Key);
}

Y funciona. el foco se queda "clavado" en mi componente y lo pinta de azul y no hace ni caso a la tecla TAB . Si se desea que pase al siguiente control hay que poner el form donde se coloca este componente:

void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if(Key == VK_RETURN) Perform(WM_NEXTDLGCTL, 0, 0); //Para emular el TAB
}
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.