PDA

Ver la Versión Completa : Como Pausar un Ciclo "WHILE"


jorgito.crazy
29-06-2006, 17:14:18
Hola a todos, no se si esta se el foro correcto, pero creo que tiene algo que ver. ¿Es posible pausar un ciclo en un procedimiento determinado desde otro procedimiento?, por ejemplo:

BUTTON1(on click):
begin
while a<100000 do
inc (a)
end;

Ahora, cuando haga click en BUTTON2, entonces el ciclo se ponga en "BREAK", y cuando clikee de nuevo, en "CONTINUE". Además de que no se como se hace esto, cuando un ciclo está en proceso y se clikea un Tbotton, no ocurre nada, es como si la aplicación no respondiera, cuando en verdad si lo está haciendo.

Gracias por adelantado, un saludo a todos:)

Neftali [Germán.Estévez]
29-06-2006, 17:21:51
cuando haga click en BUTTON2, entonces el ciclo se ponga en "BREAK", y cuando clikee de nuevo, en "CONTINUE"

Utiliza una variable booleana para "simular" (ya que no puedes pararlo) que te han parado el bucle, de forma que no haga nada.


Además de que no se como se hace esto, cuando un ciclo está en proceso y se clikea un Tbotton, no ocurre nada, es como si la aplicación no respondiera, cuando en verdad si lo está haciendo.

Para que responda a los eventos debes colocar dentro del bucle la siguiente instrucción:

Application.ProcessMessages;

jorgito.crazy
29-06-2006, 17:37:28
Gracias neftalí, esto de application.ProcessMessages, no atrazará un poco el ciclo?, según parece, lo que hace ese procedimiento es; dentro del mismo ciclo, revisar el estado de los controles no?. Tengo otro problemita: la aplicación, no cierra hata que no termina el ciclo, que puedo hacer?,
Gracias otra vez neftalí.;)

yusnerqui
29-06-2006, 17:37:32
Hola, debes usar dos variable globales, una que te indicará cuando debes parar el ciclo y otra que te guardará el valor del contador en el momento que se ha hecho la pausa.

Dentro del siclo debes poner Application.ProcessMessages para que la aplicación te responda a los eventos y ... Bueno mejor te escribo un ejemplo:

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Para : Boolean;
Valor : Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Valor := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
I := Valor;
Para := False;
Screen.Cursor := crHourGlass;
try
while I < 90000000 do
begin
I := I +1;
if Para then
begin
Valor := I;
Break;
end;
Application.ProcessMessages;
end;
finally
Screen.Cursor := crDefault;
end;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
Para := True;
end;
end.




es todo, espero haberte ayudado

Saludos Yusnerqui

Neftali [Germán.Estévez]
29-06-2006, 18:28:12
lo que hace ese procedimiento es; dentro del mismo ciclo, revisar el estado de los controles no?

No. Esto lo que hace es revisar los mensajes que haya pendientes en la cola de mensajes de windows y los procesa; Si no lo colocas no se revisan y por eso el programa no hace caso ni al teclado ni al ratón hasta que no acaba el bucle.

jorgito.crazy
29-06-2006, 19:11:40
OK, Muchas gracias Neftalí y Yusnerqui, solo me queda una preguntica: Que es Try....Finally?:rolleyes:

yusnerqui
29-06-2006, 19:56:55
Que es Try....Finally


Pues aquí (http://www.clubdevelopers.com/index.php?p=55) podrás encontrar información al respecto.

Saludos.

jorgito.crazy
29-06-2006, 21:24:01
Bueno, eso esta un poco complicado, pero bueno lo importate que quiero decirte es, que en el codigo que me diste, Quitando Try y Finally, entonces el codigo funciona igual, en la página que me dices, dice Try y Exeption, y habla de las exepciones, lo que quiero saber es...mira por ejemplo:

While ...Do
begin
Realiza la acción hasta que se cumpla la condicón.
end;

Ya entiendes?, de todas formas, muchas gracias por la página de exepciones, no sabía nada de lo que se narra en ese lugar. Bueno.

Un saludo Brother;)

Lepe
30-06-2006, 11:40:42
El try .. finally es un "seguro de vida".

Imagina que dentro del bucle while haces cálculos numéricos y se produce una división por cero, en este caso, se corta la ejecución en esa linea y el cursor de la pantalla se queda con el reloj de arena.

Al colocar un Try .. finally, aunque se produzca un error, siempre ejecutará el código existente en el Finally, por tanto, se restaura siempre el cursor a la típica flecha.


lo que quiero saber es...mira por ejemplo:

While ...Do
begin
Realiza la acción hasta que se cumpla la condicón.
end;

Ya entiendes?,

No, realmente no.

Saludos

jorgito.crazy
03-07-2006, 15:42:39
Muchas gracias Lepe, ahora entiendo.

Un saludo;)