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 28-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Como abortar correctamente un proceso que es interrumpido por el cierre del Form

Hola amig@s !

En el OnActivate de un Form llamo a un proceso que tarda algunos segundos en generar la pantalla que quiero mostrar.

Código Delphi [-]
procedure TForm.FormActivate(Sender: TObject);
begin
  Self.OnActivate := nil;
  FormRepaint;
end;

Si el usuario, durante dicho proceso FormRepaint, hace click para cerrar el Form, de manera inmediata se llama a la rutina FormClose.

Código Delphi [-]
procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  FormMain := nil;
end;

pero me he dado cuenta que al finalizar FormClose, prosigue con FormRepaint en el punto en el cual se interrumpió por el cierre del Form.

Y finalmente, entre otras cosas, FormMain no queda a Nil.

Como puedo entonces abortar correctamente FormRepaint dentro del proceso FormClose ?? O como se solucionaría esta problemática de la manera correcta ?

He intentado meter toda el código de FormRepaint en un Try Except pero a pesar de ello no me produce ninguna excepción y por lo tanto no sale del bucle Try, prosiguiendo como indica antes en el mismo punto en donde se interrumpió por la llamada a FormClose.

Gracias por vuestra ayuda.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 28-08-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Te respondo como lo haría yo. Esto no aborta el FormRepaint, pero por lo menos no te generará los errores de no liberar al form.

Variable global al form:
PuedoCerrar : boolean;

Código:
procedure TForm.FormActivate(Sender: TObject);
begin
  Self.OnActivate := nil;
  PuedoCerrar := False;
  FormRepaint;
  PuedoCerrar := True;
end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if (PuedoCerrar) then
  begin
     Action := caFree;
     FormMain := nil;
  end else
     Action := caNone;
end;

Última edición por duilioisola fecha: 28-08-2007 a las 14:19:57.
Responder Con Cita
  #3  
Antiguo 28-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias por responder.

No quiero que se impida el cierre del Form, que es lo que ocurriría con tu propuesta.

Lo que quiero es que se pueda cerrar el form abortando el proceso FormRepaint.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 28-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Por cierto, en estos casos, Bienvenido al Club !
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 28-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Y que haces dentro de FormRepaint? Si es un proceso normal, el cierre no se debería de producir hasta que terminara el FormRepaint, así que supongo que estas utilizando Application.ProcessMessage ¿es así?

Explicate un poco mas
Responder Con Cita
  #6  
Antiguo 28-08-2007
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Gracias por la bienvenida... he utilizado el foro para resolver muchos de mis problemas y pensé que sería bueno escribir algo para los demás.

Otra opción con 2 variables globales... en este caso, se llena QuieroCerrar, pero no se cierra y después del FormRepaint, si es True, se cierra.

Nuevamente, no aborta el FormRepaint, pero cerrará el form correctamente después de todo.

Espero que se parezca a lo que buscas.

(para acelerar el cierre, quizás puedas usar la variable global PuedoCerrar dentro del procedure FormRepaint para NO ejecutar ciertas cosas que tarden mucho.
ej. pseudocodigo
Código:
procedure FormRepaint
begin
   if PuedoCerrar then
      [primera cosa a realizar]
   if PuedoCerrar then
      [seguinda cosa a realizar]
   if PuedoCerrar then
      [tercera cosa a realizar]
   if PuedoCerrar then
      [primera cosa a realizar]
end
)

Variable global al form:
PuedoCerrar : boolean;
QuieroCerrar : boolean;

Código:
procedure TForm.FormActivate(Sender: TObject);
begin
   Self.OnActivate := nil;
   PuedoCerrar := False;
   QuieroCerrar := False;
   FormRepaint;
   PuedoCerrar := True;
   if (QuieroCerrar) then
      Close;
end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if (PuedoCerrar) then
   begin
      Action := caFree;
      FormMain := nil;
   end else
   begin
      Action := caNone;
      QuieroCerrar := True;
   end;
end;

Última edición por duilioisola fecha: 28-08-2007 a las 14:34:48.
Responder Con Cita
  #7  
Antiguo 28-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Había utilizado ya 'Flags' para abortar el proceso FormRepaint. Todo funciona en teoría correctamente, cancelo el repintado y cierro el form.

Pero preguntaba si había otra manera más 'correcta'. El inconveniente de utilizar ese 'Flag' para abortar el proceso de repintado, es que de hecho al final del todo, después de cerrar el Form, la variable FormMain no queda a Nil.

Por lo tanto, en mi menú principal de la aplicación, dicho Form aparece como si estuviera 'activo'.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #8  
Antiguo 28-08-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
Por lo tanto, en mi menú principal de la aplicación, dicho Form aparece como si estuviera 'activo'.
Como compruebas si el form esta activo, supongo que así:
Código Delphi [-]
  if FormMain <> nil then
   ... etc

Prueba con esto:
Código Delphi [-]
function Existe(F: TForm): Boolean;
var
  i: integer;
begin
  for i:= 0 to Screen.FormCount - 1 Do
    if Screen.Forms[i] = F then
    begin
      Result:= TRUE;
      Exit;
    end;
  Result:= FALSE;
end;

if Existe(FormMain) then
  etc ...
Responder Con Cita
  #9  
Antiguo 28-08-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No entiendo bien el motivo de cerrar cuando está abriendo, pero en fin... ¿por qué no lo pones invisible, hide, y luego lo pones a nil desde donde lo has llamado.
Código:
procedure TfrmBackRestAux.FormClose(Sender: TObject; var Action: TCloseAction);
begin   
  inherited;
  Action := caHide;
end;
Código:
  frmAux := TfrmBackRestAux.Create(owner);
  frmAux.ShowModal;
  // frmAux.Free;
  FreeAndNil(frmAux);
Creo que te puede servir algo así.
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
Actualizar form al volver a el mientras se realiza proceso largo(p.e: recorrer db) Wonni Varios 5 18-06-2007 19:44:00
Abortar un proceso TONIAM Varios 10 31-05-2007 19:26:41
¿como abortar ejecución de eventos? pjjorda Varios 5 06-06-2006 20:59:59
Como Abortar mi APP sin q aparescan Mens de ERROR pcicom OOP 5 22-03-2005 09:22:13
Como evitar que el usuario cierre la form! Waldo API de Windows 2 20-11-2003 18:46:47


La franja horaria es GMT +2. Ahora son las 08:42:01.


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