Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Interrumpir un ciclo Repeat - Until

Hola!

Un saludo y un feliz año a todos los integrantes del club.

Mi pregunta basicamente es ¿como interrumpir le ejecucion de un ciclo Repeat - Until (son dos anidados) usando la tecla ESC?

basicamente el ciclo es:

Código Delphi [-]
repeat
   repeat
      until //lo que sea
until //lo otro 
 
//intente esto pero no me hace nada. key es un var de tipo Char
repeat
   repeat
      if key = #27 then
        break;
      until //lo que sea que espere
   if key = #27 then
      break;
until //lo otro que espere

Como siempre agradeciendo su ayuda
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #2  
Antiguo 06-01-2009
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Yo lo he probado y si funciona, el problema que veo que puede ser por el que no te funcione, es que no le das tiempo a la aplicación para leer el teclado, para leer la tecla esc, por lo que nunca te sale del ciclo.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 06-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
mmmm....
coloque

Código Delphi [-]
sleep(100);


antes de la comprobacion de la tecla ESC pero no, no me funciona...
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #4  
Antiguo 06-01-2009
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
¿Cómo se supone que obtiene el valor la variable key? lo pregunto porque estas haciendo un ciclo en el que 'key' no actualiza nunca su valor. Por eso nunca saldrá del bucle, por muchos sleeps que pongas. Si key obtiene su valor por una llamada a una función, deberás intercalarla en el propio ciclo. Si pones el pedazo de código más ampliado, quizás pueda ayudarte mejor.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #5  
Antiguo 06-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
jajajaja tienes razon!!

Key nunca obtiene un valor!

Ah que bruto soy!!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #6  
Antiguo 06-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Continuo con esto, he cambiado el codigo por este otro que encontre en un hilo del club; el truco es de trucomania.

Código Delphi [-]
// Los datos se repiten y terminan con #13(CR)
  repeat
    repeat
      //Rompe ciclo con ESC
      Application.ProcessMessages ;
      if GetKeyState(VK_Escape) and 128 = 128 then
        break;
    until FileRead(HandlePuerto,Num,1)=1;
  //Rompe ciclo con ESC
  Application.ProcessMessages ;
  if GetKeyState(VK_Escape) and 128 = 128 then
    break;
  until Num = Terminador; // Final de cadena anterior

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?

Una manita...
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #7  
Antiguo 06-01-2009
Avatar de Fenareth
[Fenareth] Fenareth is offline
Miembro Premium
 
Registrado: oct 2007
Ubicación: Guadalajara, Jalisco, México
Posts: 494
Poder: 17
Fenareth Va por buen camino
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?

Una manita...
Pues por lo que se ve es una condición que siempre se cumple, siempre verdadera, no le veo, de buenas a primeras, mucho sentido...
__________________
Ask questions. Think for yourself. Wake up and you’ll make the difference
Responder Con Cita
  #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
Poder: 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
  #9  
Antiguo 06-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Lo siento si soy molesto pero ...no me funciona, modifique con la sugerencia que me diste Roman pero no, igual se queda en ciclo infinito. En si lo que estoy capturando es una cadena proveniente del COM1,el puerto ya esta abierto y comprobado que con esta rutina captura adecuadamente, sin embargo lo que quiero es poder romper el ciclo repeat - until con ESC en caso de que por alguna razon la cadena no pudiese ser capturada (puerto dañado, cadeana enviada diferente, etc). Actualmente solo desconecto el dispositivo que envia datos para poder simular una falla y usar ESC para salir del bucle.

Código Delphi [-]
// Los datos se repiten y terminan con #13(CR)
  repeat
    Application.ProcessMessages ;
    
      repeat
      Application.ProcessMessages ;
      until (FileRead(HandlePuerto,Num,1)=1) or (GetKeyState(VK_ESCAPE) and 128 = 128);
  until (Num = Terminador) or (GetKeyState(VK_ESCAPE) and 128 = 128); // Final de cadena anterior
  
  Cad:='';
  
  for n := 1 to longCadena do
    begin
      repeat
        //Rompe ciclo con ESC
        Application.ProcessMessages ;
        until (FileRead(HandlePuerto,Num,1)= 1) or (GetKeyState(VK_ESCAPE) and 128 = 128);//lee un byte
      Cad := Cad + chr(Num);
    end;
 
  cPeso := MidStr(Cad,3,8);
  cUnits := MidStr(Cad,11,1);
  cMode := MidStr(Cad,12,1);
  cStatus := MidStr(Cad,13,1);
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #10  
Antiguo 06-01-2009
Avatar de Fenareth
[Fenareth] Fenareth is offline
Miembro Premium
 
Registrado: oct 2007
Ubicación: Guadalajara, Jalisco, México
Posts: 494
Poder: 17
Fenareth Va por buen camino
Cita:
Empezado por roman Ver Mensaje
...
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
Excelente hoy aprendí algo nuevo de "rebote"
__________________
Ask questions. Think for yourself. Wake up and you’ll make the difference
Responder Con Cita
  #11  
Antiguo 07-01-2009
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
OK, ya me funciono....el problema estaba en que como desconectaba el transmisor nunca recibia nada y en la sentencia :

Código Delphi [-]
repeat
      until (FileRead(HandlePuerto,Num,1)=1) or (GetKeyState(VK_ESCAPE) and 128 = 128);

el FileRead espera recibir un caracter el cual al estar desconectado nunca llega. Si modifico la cadena enviada para que no cumpla lo que espero funciona bien con la tecla ESC. Ahora el problema cambia a como abortar el ciclo si no llega nada al puerto serie. Jeje Ese sera tema de otro hilo.

Gracias por la ayuda!!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Interrumpir proceso Jose_Pérez Varios 3 07-01-2009 00:23:02
Duda sobre variable en un Bucle Repeat gerupc Varios 9 21-07-2007 02:44:34
crear label por codigo en un ciclo for.. las beses de el ciclo sakuragi .NET 3 29-09-2005 05:04:29
Interrumpir un for Majo Varios 10 31-03-2004 21:37:53
Interrumpir un procedimiento almacenado mlara Firebird e Interbase 1 30-01-2004 09:59:48


La franja horaria es GMT +2. Ahora son las 08:58:35.


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
Copyright 1996-2007 Club Delphi