Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-01-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Cerrar Formulario

Hola a todos,

Tengo un problema en aplicación que no se si será general o no a ver si me podeis echar una mano:

Es una aplicación de escritorio realizada con Delphi 7 de lo más corriente, en los tiempos de carga (que algunos son elevados), muestro un formulario de espera (de forma normal, .show) con la propiedad FormStyle:=fsStayOnTop y una barra de progreso que se incrementa con un Timer.

Cuando se finaliza el proceso cierro el formulario con FormularioEspera.close.

Si la aplicación ha sido minimizada o ha perdido el foco y en ese tiempo se le manda cerrar el formulario, no se cierra y luego es imposible cerrar el formulario manualmente.

He probado con .close .hide .visible:=false y no lo consigo.

Ocurre tanto en XP, Vista y W7 ¿Alguna idea?

Gracias por adelantado.
Responder Con Cita
  #2  
Antiguo 21-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola Red_Leon, todo dependerá si mientras está visble la ventana de espera deseas hacer algo o no.

Si no tienes que hacer nada (solo esperar a que acabe), llámala en modo [/b]ShowModal[/b] y que sea la propia ventana la que se cierre:
- En el evento OnActivate llamas a la función que ejecute lo que desees.
- Al final de la función pones ModalResult := mrOk, para que devuelva la atención a la ventana llamadora, y en ésta ventana la eliminas con Free
Responder Con Cita
  #3  
Antiguo 21-01-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Lo he probado y la aplicación se bloquea durante el tiempo de espera, pero se cierra.

Y he probado a meter las funciones en hilos pero entonces obtengo el mismo resultado que anteriormente.

Gracias de todas formas salvica.
Responder Con Cita
  #4  
Antiguo 21-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Estoy suponiendo que el form de espera lo llamos desde una ventana, no desde la aplicación al modo de un SplashScreen, no?
Responder Con Cita
  #5  
Antiguo 21-01-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Se llama desde una ventana, pero si a modo de SplashScreen.

Se utiliza al presentar un informe, la carga de este formulario y un informe de grandes dimensiones puede tardar entre 20 y 30 seg.
Entonces llamo al formulario de Espera, y despues ejecuto la función del informe, para que no se quede bloqueado llamo a Application.ProccessMessage, cuando termina la función del informe llamo a cerrar el Formulario y si la aplicación no tiene el foco de windows (estado minimizado o otra aplicación delante) el Formulario Espera no se cierra, si lo conserva se cierra.
Responder Con Cita
  #6  
Antiguo 21-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por Red_Leon Ver Mensaje
Se llama desde una ventana, pero si a modo de SplashScreen.

Se utiliza al presentar un informe, la carga de este formulario y un informe de grandes dimensiones puede tardar entre 20 y 30 seg.
Entonces llamo al formulario de Espera, y despues ejecuto la función del informe, para que no se quede bloqueado llamo a Application.ProccessMessage, cuando termina la función del informe llamo a cerrar el Formulario y si la aplicación no tiene el foco de windows (estado minimizado o otra aplicación delante) el Formulario Espera no se cierra, si lo conserva se cierra.
Me parece que los tiros vienen porque hay algún componente en la ventana que no se ha cerrado.
- Prueba a poner una variable booleana global (por ejemplo CerrarVentana que inicializas a false en el evento OnCreate de la ventana de espera.
- Al finalizar tu función la cambias a true.
- Yo lo que hago es crearlas y eliminarlas cada vez que las necesito, por lo que en tu aplicación pones donde necesites:
Código:
  Application.CreateForm(TForm_Espera, Form_Espera);
  with Form_Espera do begin
       TuFuncion;
        while not CerrarVentana do
              Application.ProcessMessages;
       Hide;
       Free;
  end;
A mi no me da problemas con las SplashScreen, pero si se te sigue colgando puedes probar a poner en el evento OnClose un bucle que te elimine los objetos que tenga la ventana para comprobar cual es el que no ha cerrado completamente

Saludos
salvica
Responder Con Cita
  #7  
Antiguo 22-01-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
No habia intentado el .Free porque me parecia demasiado radical, pero ¡FUNCIONA! puedo el codigo como esta solamente creando y destruyendo el formulario cuando haga falta.

Mucha gracias salvica.

Luego vere a ver que es lo que se esta quedando abierto, ya por curiosidad y por no estar creando y destruyendo formularios.
Responder Con Cita
  #8  
Antiguo 22-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por Red_Leon Ver Mensaje
No habia intentado el .Free porque me parecia demasiado radical, pero ¡FUNCIONA! puedo el codigo como esta solamente creando y destruyendo el formulario cuando haga falta.

Mucha gracias salvica.

Luego vere a ver que es lo que se esta quedando abierto, ya por curiosidad y por no estar creando y destruyendo formularios.
Hola Red_Leon, me alegra que funcione

Si Free elimina el formulario sin problemas no creo que quede ningún recurso abierto. Dado que no conozco el código que utilizas, te comento las "dos posibles" causas (pueden haber más) que se me ocurren para que se cuelgue la aplicación:

- Creas el Form_Espera al inicio de la aplicación: Con esto la ventana está disponible en todo el proceso. No se debe eliminar, solo ocultarla (Form_Espera.Show, Form_Espera.Hide). Si haces un Close, es como si la hubieses eliminado (Free) y cuando intentas un Show "casca" porque el form ya no existe

- Creas el Form_Espera cuando le necesitas: La ventana está disponible SOLO a partir de éste momento. Si no la eliminas al finalizar la función que la llama "casca" al crearla de nuevo porque ya existe previamente.

En el foro verás que hay ejemplos que utilizan FreeAndNil en lugar de Free (a secas) para eliminar un formulario de la memoria.

Saludos
salvica
Responder Con Cita
  #9  
Antiguo 22-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Segun veo puede que el problema vaya por el Timer que tienes corriendo en tu formulario de espera, para lo cual seria muy provechoso si mostraras el código que tienes en el evento OnTimer de tu Timer..

Aclarando
un poquito el comentario de salvica, quiero hacerle notar que cuando se cierra un formulario, éste no se destruye ni se libera (Free) (solo se hace no visible por defecto), a no ser que le indiquemos a delphi que lo libere y es justo para eso el evento OnClose del formulario usando la variable Action de los parametros que tiene dicho evento;
por ejemplo:
Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
Action:=caFree;{<--aqui le estoy indicando a Delphi que cuando
se cierre el formulario se libere ,aunque en realidad no lo 
libera de imnediato, ya que en este caso internamente delphi 
utiliza el metodo Release de los formulario y no el Free que se espera
(ver en la ayuda sobre el metodo Release y el evento OnClose del Form). 
Si no  se cambia esta variable, simplemente  el formualrio se ocultará (Hide) pero no se liberará. } 
end;
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 22-01-2010 a las 14:37:48.
Responder Con Cita
  #10  
Antiguo 22-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
...

Aclarando
un poquito el comentario de salvica, quiero hacerle notar que cuando se cierra un formulario, éste no se destruye ni se libera (Free) (solo se hace no visible por defecto), a no ser que le indiquemos a delphi que lo libere y es justo para eso el evento OnClose del formulario usando la variable Action de los parametros que tiene dicho evento;
...
Saludos...
Siempre se aprende algo nuevo y siempre había creido que cose llamaba internamente a Destroy, a no ser que abortases la operación (con el Action)

Saludos
salvica
Responder Con Cita
  #11  
Antiguo 22-01-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por salvica Ver Mensaje
Siempre se aprende algo nuevo y siempre había creido que cose llamaba internamente a Destroy, a no ser que abortases la operación (con el Action)

Saludos
salvica
Eso lo aprendi leyendo este fabuloso articulo del Dr.Marteens y por supuesto revisando el codigo del metodo Close del formulario.
Saludos hasta España...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #12  
Antiguo 27-01-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
Segun veo puede que el problema vaya por el Timer que tienes corriendo en tu formulario de espera, para lo cual seria muy provechoso si mostraras el código que tienes en el evento OnTimer de tu Timer..
Aqui va el código

Código Delphi [-]

procedure TForm_Espera.Timer_CambioTimer(Sender: TObject);
begin
  {Aumento del progreso de la 'ProgressBar_Espera'}
  self.ProgressBar_Espera.StepIt;
  {Se comprueba si ha llegado al límite superior}
  if(self.ProgressBar_Espera.Position=self.ProgressBar_Espera.Max) then
  begin
    {Reseteo de la posición de la 'ProgressBar_Espera'}
    self.ProgressBar_Espera.Position:=self.ProgressBar_Espera.Min;
  end;
end;

De momento utilizo el .Create y .Free con el formulario y me va perfecto, pero todavia no he tenido tiempo de porque con .Close no se cerraba, me ha sido más rápido realizar el cambio que ver el porque.
Responder Con Cita
  #13  
Antiguo 29-01-2010
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por Red_Leon Ver Mensaje
Aqui va el código

Código Delphi [-] procedure TForm_Espera.Timer_CambioTimer(Sender: TObject); begin {Aumento del progreso de la 'ProgressBar_Espera'} self.ProgressBar_Espera.StepIt; {Se comprueba si ha llegado al límite superior} if(self.ProgressBar_Espera.Position=self.ProgressBar_Espera.Max) then begin {Reseteo de la posición de la 'ProgressBar_Espera'} self.ProgressBar_Espera.Position:=self.ProgressBar_Espera.Min; end; end;


De momento utilizo el .Create y .Free con el formulario y me va perfecto, pero todavia no he tenido tiempo de porque con .Close no se cerraba, me ha sido más rápido realizar el cambio que ver el porque.
Con esto solo mueves la ProgressBas, pero no se para, por lo que si intentas cerrar el Form te va a dar un error ¿es éste el problema?
Responder Con Cita
  #14  
Antiguo 08-02-2010
Avatar de Red_Leon
Red_Leon Red_Leon is offline
Miembro
 
Registrado: oct 2007
Ubicación: Castilla la Mancha
Posts: 27
Poder: 0
Red_Leon Va por buen camino
Antes de cerrar el formulario, paro el Timer y luego llamo a .Close y no se cierra. Ese es el problema original, pero que ya os digo con lo del .Free se solucionaria.
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
cerrar formulario Patricio Varios 2 04-07-2008 23:52:27
Cambiar propiedad de componente del formulario padre al cerrar el formulario hijo jzginez OOP 5 22-06-2007 21:40:51
Cerrar conexión al cerrar formulario arantzal Conexión con bases de datos 5 09-08-2006 12:43:52
Cerrar formulario en uso locojoan API de Windows 1 21-06-2006 17:08:22
Boton cerrar del formulario (X) Un abrazo OOP 2 26-05-2003 16:26:54


La franja horaria es GMT +2. Ahora son las 20:56:24.


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