Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Interrumpir un for (https://www.clubdelphi.com/foros/showthread.php?t=8747)

Majo 31-03-2004 19:45:03

Interrumpir un for
 
Hola amigos

Tengo la siguiente duda...

Tengo un ciclo que realiza cierto proceso, resulta que quiero mostrar el proceso paso a paso, es decir, iteración por iteración. por ejemplo

for i :=0 to n-1 do
begin
{Lineas de algunos cálculos}
.... {Mostrar ciertos resultados de los cálculos en un memobox}...
{el proceso se continúa por ejemplo haciendo click en un botón}

{Continuar ejecutando otras lineas del ciclo para hacer mas cálculos}
.... {Mostrar ciertos resultados de los Nuevos calculos en un memobox}...
{el proceso se continúa por ejemplo haciendo click en un botón}

end;

Alguien puede decirme como puedo hacer lo anterior?

Gracias de antemano

__cadetill 31-03-2004 19:46:07

Quizás esto?

memo.lines.Add('lo que quiera añadir');

Majo 31-03-2004 19:56:07

En realidad lo que quiero es detener la ejecución del ciclo.

Como un "PARE" en cierta linea... Ejecutar una form con un botón.... esperar a que se de click sobre el boton.... y solo despues del click "CONTINUE" con la ejecución del ciclo....

marcoszorrilla 31-03-2004 19:57:02

Además de lo que dice el amigo Cadetill, tendrías que poner dentro del bucle:
Código:

Application.ProcessMessages
Para que al pulsar cierto botón te haga caso y se pare y te pregunte si quieres seguir ó no.

Mirate la ayuda sobre Continue y también como abandonar un bucle en el supuesto de quisieras abandonar el ciclo antes de que finalice.

Un Saludo.

__cadetill 31-03-2004 20:46:59

Vale, creo que no te entendí

a ver ahora (y teniendo en cuenta lo comentado por Marcos.....)

Código:

var
  Preguntar: boolean;

procedure TMiForm.ProcesoQueSeaQueHaceBucle(parametros);
begin
  Preguntar := false;
  for i :=0 to n-1 do
  begin
    if Preguntar then
      Application.MessageBox('Desea cancelar el proceso?', 'Atención',
          MB_APPLMODAL or MB_ICONQUESTION or MB_YESNO) = mrYes then
      Break;

    // proceso del bucle
    Application.ProcessMessages;
  end;
end;

procedure TMiForm.BotonClick(Sender: TObject);
begin
  Preguntar := true;
end;


roman 31-03-2004 20:47:01

¿Qué no basta mostrar el formulario del memo con ShowModal? Juaría que con esto, sin continue ni ProcessMessages bastaría.

:confused:

// Saludos

roman 31-03-2004 20:49:24

Te me adelantaste cadetill. Pero reitero lo dicho. No considero necesario ProcessMessages. Dicha línea no se ejecutará mientras esté desplegada la ventana modal. Y en el supuesto de que se ejecutara querría decir que el ciclo sigue corriendo mientras se muestra en lugar de pausarse como se requiere.

// Saludos

__cadetill 31-03-2004 20:52:12

Cita:

Empezado por roman
Te me adelantaste cadetill. Pero reitero lo dicho. No considero necesario ProcessMessages. Dicha línea no se ejecutará mientras esté desplegada la ventana modal. Y en el supuesto de que se ejecutara querría decir que el ciclo sigue corriendo mientras se muestra en lugar de pausarse como se requiere.

Es que no se exactamente lo que quiere conseguir Majo. No se si es lo que tu dices (mostrar otro formulario, con lo cual, tendrías razón) o simplemente dar al usuario la posibilidad de cancelar (acabar) el bucle en cualquier momento

Majo 31-03-2004 21:14:40

Cita:

Empezado por cadetill
Es que no se exactamente lo que quiere conseguir Majo.

Lo que realmente necesito es pausar el ciclo no salirme de él... para salirme de él creo que basta con Break. Al referirme a pausar, quiero decir que "pare" en cierta linea, para mostrar ciertos datos (POr ejemplo en memobox) y luego dado cierto evento, por ejemplo el click en un botón continue conla lineas del ciclo.

el código es el que sigue

Código:

Convergencia:=False;
while not Convergencia do
begin
    Picalc:=PCalculado(Vi,Di,Y);
    Qicalc:=QCalculado(Vi,Di,Y);
    Pprog:=PProgramada();
    Qprog:=QProgramada();
    DPi:=DP(Picalc,Pprog);
    DQi:=DQ(Qicalc,Qprog);
    DPi:=DividirPorVoltajes(DPi,Vi);
    DQi:=DividirPorVoltajes(DQi,Vi);
   
    HallarSubmatricesHNJL(H,N,J,L,Picalc,Qicalc,Vi,Di,Y);
    SetLength(L,NroDeBarras-1-Ng,NroDeBarras-1-Ng);

    VectorDP:=VectorColumna(DPi,VectorVacio);
    VectorDQ:=VectorColumna(DQi,VectorVacio);
   
    {Acá se debe mostrar una form que posee un memobox y un botón. En   
    el memobox se imprimen los vectores "VectorDP y Vector DQ. es en este
    linea que quiero que el ciclo se pause y que solo continue cuando se de
    click sobre el boton aceptar. el problema que tengo es que la form se
      muestra pero el ciclo no se detiene y sigue ejecutándose hasta que
      termina}

    Plasd:=Plasd+1;
    VectorDeltaD:=MultiplicarMatrices(InvMatReal(H),VectorDP);
    VectorDeltaV:=MultiplicarMatrices(InvMatReal(L),VectorDQ);


    if not convergencia then
        begin
        ActualizarV(Vi,VectorDeltaV);
        ActualizarD(Di,VectorDeltaD);
        end;
  end;


roman 31-03-2004 21:31:48

Pues no hay ningún problema. Simplemente muestra el form con ShowModal. Probablemente lo intentas mostrar con Show lo cual, efectivamente, no detendrá el ciclo pero ShowModal sí. Por ejemplo, en este ciclo

Código:

var
  I: Integer;

begin
  for I := 0 to 10000 do
  begin
    Caption := IntToStr(I);
    if I = 5000 then Form2.ShowModal;
  end;

verás que la ejecución se detiene en 5000 y no se reanuda sino hasta que cierras Form2.

// Saludos

Majo 31-03-2004 21:37:53

Gracias Roman "ShowModal" era precisamente lo que necesitaba.

Gracias al foro por su colaboración.... En cada una de las respuestas aprendemos algo nuevo :cool:


La franja horaria es GMT +2. Ahora son las 11:38:34.

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