Ver Mensaje Individual
  #8  
Antiguo 06-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por FGarcia Ver Mensaje
Segun que funciona en los bucles, pero no, no me ha funcionado, es mas no logro entender la logica: GetKeyState regresa un smallint que es el equivalente de la tecla pulsada pero ¿que hace el AND 128 = 128?
Para saber si una tecla está presionada o no, lo que importa es la información en el último bit del número que devuelve GetKeyState. La operación

Código Delphi [-]
GetKeyState and 128

aisla ese último bit ya que el 128 tiene 1 en el bit 7 y 0 en todos los demás (la operación AND es una operación booleana bit a bit).

En otras palabras, el resultado de la operación sólo puede ser 128 ó 0. De ahí la comparación con 128.

Yo he hecho la prueba y funciona si añades a tu ciclo una llamada a Application.ProcessMessages:

Código Delphi [-]
repeat
  Application.ProcessMessages;

  ....

  if GetKeyState(VK_ESCAPE) and 128 = 128 then
    break;
until Num = Terminador

aunque yo lo pondría así:

Código Delphi [-]
repeat
  Application.ProcessMessages;

  ....

until (Num = Terminador) or (GetKeyState(VK_ESCAPE) and 128 = 128)

Agrego

Otra cosa: el operador and tiene precedencia sobre el operador =. Por tanto, la expresión

Código Delphi [-]
GetKeyState(VK_ESCAPE) and 128 = 128

es equivalente a

Código Delphi [-]
(GetKeyState(VK_ESCAPE) and 128) = 128

De manera que no es que la condición siempre sea verdadera.

// Saludos
Responder Con Cita