Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.144
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

No es preciso que lo hagas en ningún evento específico, aunque puedes hacerlo así si es mejor o lo prefieres. Personalmente estoy utilizando un procedimiento para hacer lo que tú precisas y parte del procedimiento es este:

Código Delphi [-]
   if GetKeyState(VK_CAPITAL) = 1 then
     bEstado.Panels[8].Text := rsBloqMayus
   else
     bEstado.Panels[8].Text := '';
   if GetKeyState(VK_NUMLOCK) = 1 then
     bEstado.Panels[9].Text := rsBloqNum
   else
     bEstado.Panels[9].Text := '';
   if GetKeyState(VK_SCROLL) = 1 then
     bEstado.Panels[10].Text := rsScrolLock
   else
     bEstado.Panels[10].Text := '';
Puedo llamar al procedimiento desde "OnKeyDown", pero, también desde cualquier otro lugar, ya que en el mismo no se precisa de los parámetros que proporciona "OnKeyDown", por poner un caso. En cuanto a que no te funcione "VK_NUMLOCK"... lo único que puedo decirte es que en Delphi 7 y Windows Xp SP2 sí que funciona correctamente.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 11-08-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 22
jmariano Va por buen camino
Saludos dec!

Justo vi tu respuesta despues de publicar la mia y quería preguntarte, ¿Te devuelve a ti "GetKeyState" un valor entre 0 y 1 al comprobar el NumLock? Porque tengo el mismo sistema operativo que tu (XP2) y la misma versión de Delphi (v7) y lo que me devuelve, en realidad, es un número entero negativo (-127 y -128, según esté o no activo), y al mirar la ayuda sobre esta función comenta que lo que cambia al activar o desactivar es el bit menos significativo (por eso da un número negativo).

Chao!
Responder Con Cita
  #3  
Antiguo 12-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.144
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por jmariano
¿Te devuelve a ti "GetKeyState" un valor entre 0 y 1 al comprobar el NumLock?
Así es jmariano. Un 0 si la tecla en cuestión no está "activada" y un 1 si lo está...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 12-08-2005
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 22
Sr.Scorpion Va por buen camino
Gracias a los dos por responderme..... problema resuelto. Eso si la funcion de DEC no me funciona, sigue como estaba antes... tuve que sumarle 127 como decia jmariano y asi fue como me trabajo.


Saludos y Gracias
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #5  
Antiguo 12-08-2005
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 22
Sr.Scorpion Va por buen camino
Talking

Bueno al final tuve que hacer dos procedimientos... uno para el estado de las teclas y otro para cuando se presionan. En el evento OnShow de la Forma principal llamo al procedimiento KeyState.. el cual se ejecuta solamente una vez.

Código:
 
procedure TMain.KeyState();
begin
If GetKeyState(VK_NUMLOCK) = 1 Then
 StatusBar.Panels[2].Style:= psText
else
 StatusBar.Panels[2].Style:= psOwnerDraw;
If GetKeyState(VK_CAPITAL) = 1 Then
 StatusBar.Panels[3].Style:= psText
else
 StatusBar.Panels[3].Style:= psOwnerDraw;
If GetKeyState(VK_SCROLL) = 1 Then
 StatusBar.Panels[4].Style:= psText
else
 StatusBar.Panels[4].Style:= psOwnerDraw;
end;
y el otro procedimiento es KeyPressed que lo llamo solamente en el OnKeyDown y se le pasa como parametro la variable Key del OnKeyDown

Código:
 
procedure TMain.KeyPressed(Key: DWORD);
begin
If Key = VK_NUMLOCK then
 if (GetKeyState(VK_NUMLOCK) + 127) = 0 Then
   StatusBar.Panels[2].Style:= psText
  else
   StatusBar.Panels[2].Style:= psOwnerDraw;
If Key = VK_CAPITAL then
 if (GetKeyState(VK_CAPITAL) + 127) = 0 Then
   StatusBar.Panels[3].Style:= psText
  else
   StatusBar.Panels[3].Style:= psOwnerDraw;
If Key = VK_SCROLL then
 if (GetKeyState(VK_SCROLL) + 127) = 0 Then
   StatusBar.Panels[4].Style:= psText
  else
   StatusBar.Panels[4].Style:= psOwnerDraw;
end;
Si pueden mejorarlo pues bienvenido sea.... esto por lo menos soluciona el problema.
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
  #6  
Antiguo 12-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No entiendo bien por qué la discrepancia en el funcionamiento. A mi me funciona como dice dec. Ahora, según la documentación, la comparación tendría que hacerse así:

Código Delphi [-]
if GetKeyState(VK_CAPITAL) and 1 = 1 then
  ...

Por otra parte, si lo que se desea es mostrar el estado de estas teclas en una barra de estado, yo me olvidaría del OnKeyDown y pondría un Timer que se ejecute cada 10 ms en donde haría la comprobación. De esta manera, sólo tienes que poner el código en un lugar y además el estado se reflejará correctamente aun cuando el estado de la tecla cambie por razones distintas a oprimir la tecla (al menos a mi me pasa cada tanto que la tecla NumLock se apaga luego de correr alguna aplicación).

// Saludos
Responder Con Cita
  #7  
Antiguo 12-08-2005
Avatar de Sr.Scorpion
Sr.Scorpion Sr.Scorpion is offline
Miembro
 
Registrado: mar 2005
Posts: 92
Poder: 22
Sr.Scorpion Va por buen camino
Lightbulb

Esa sentencia merece un aplauso y una reverencia..... esto hace que el procedimiento sea unico y no haya que introducirle parametros de tecla. Por lo tanto el procedimiento quedaria asi...

Código:
 procedure TMain.KeyState();
begin
If GetKeyState(VK_NUMLOCK) and 1 = 1 Then
 StatusBar.Panels[2].Style:= psText
else
 StatusBar.Panels[2].Style:= psOwnerDraw;
If GetKeyState(VK_CAPITAL) and 1 = 1 Then
 StatusBar.Panels[3].Style:= psText
else
 StatusBar.Panels[3].Style:= psOwnerDraw;
If GetKeyState(VK_SCROLL) and 1 = 1 Then
 StatusBar.Panels[4].Style:= psText
else
 StatusBar.Panels[4].Style:= psOwnerDraw;
end;
roman... en cuanto a lo del Timer no me gusta mucho esa idea debido a que no tiene un efecto inmediato, es decir yo aprieto el CapsLock y se me demora 10 o 5 segundos en mostrarse ese cambio en mi aplicacion. Por lo menos en cuanto a mi respecta me gusta mas la onda del OnKeyDown, tiene un efecto mas inmediato. No obstante te agradezco que hayas intervenido en este post tu sentecia de verdad que me fue muy util

Saludos y Gracias
__________________
La paciencia es un árbol de raíz amarga pero de frutos muy dulces.

Sr.Scorpion
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:07:55.


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