FTP | CCD | Buscar | Trucos | Trabajo | Foros |
#1
|
||||
|
||||
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. |
#2
|
||||
|
||||
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 |
#3
|
||||
|
||||
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. |
#4
|
||||
|
||||
Estoy suponiendo que el form de espera lo llamos desde una ventana, no desde la aplicación al modo de un SplashScreen, no?
|
#5
|
||||
|
||||
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. |
#6
|
||||
|
||||
Cita:
- 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; Saludos salvica |
#7
|
||||
|
||||
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. |
#8
|
||||
|
||||
Cita:
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 |
#9
|
||||
|
||||
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: 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. |
#10
|
||||
|
||||
Cita:
Saludos salvica |
#11
|
||||
|
||||
Cita:
Saludos hasta España...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#12
|
||||
|
||||
Cita:
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. |
#13
|
||||
|
||||
Cita:
|
#14
|
||||
|
||||
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.
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|