PDA

Ver la Versión Completa : MDI Child que no se cierran


senpiterno
23-11-2004, 02:16:54
Hola amigos

Mi problema es el que menciono en el titulo, por defecto se que los formularios hijos MDI Child no se cierran a menos que en el evento onclose de este, asignemos a la variable Action el valor de cafree, que es precisamente lo que realizo, pero solo se cierra el primer MDI form y los demas al precionar la X para cerrar el formulario no hacen nada, es mas hasta el formulario contenedor deja de responer cuando lo intento cerrar...a continuacion coloco la forma en que creo los MDI Child y como los cierro...
Para crearlo:

Procedure TMenuPrincipal.PresionaEntrarMaestroUsuariosDelSistema;
Var
FormHijo:TMaestroUsuariosIndividual;
Begin

Try //Iniciamos el codigo de control de errores

//Funciones pre-carga formulario....

//Bloqueamos el repintado de la pantalla hasta que no se halla
//cargado completamente el formulario
LockWindowUpdate(Handle);
//Creamos el nuevo hijo
FormHijo:=TMaestroUsuariosIndividual.Create(Self);
//Asigna el caption que tendra el formulario
FormHijo.Caption:=ColocaNombreFormularios (CNFNomFormMaUsuariosSistema);
//Que los eventos de teclado se produscan primero en el formulario y despues en los controles
FormHijo.KeyPreview:=True;
//Dejamos que la pantalla se repinte, para mostrar en pantalla
//lo que el formulario muestra
LockWindowUpdate(0);

//Funciones pos-carga formulario....

Except //Se ha producido un error
On E:Exception Do
If (MensajesDeError(ErroresSistema(E), E, GloMsgErrorCargaFormDesdeMenuPrincipal,False)<> OpReintentar) Then Begin
CierraCualquierObjeto([FormHijo]);
Exit;//Salismos del procedimiento
End;//If
End;//on
End;

Para cerrarlos


Procedure TMaestroUsuariosIndividual.FormClose(Sender: TObject;
var Action: TCloseAction);
Begin
OperacionEnCurso:=OpSaliendo;//Se carga la operacion en curso
//Borramos el formulario de la lista de nombres abiertos
BorraNombreFormulariosEnLista(self.Caption);
//Cerramos accesos a datos
CierraCualquierObjeto([TUsuarios,DSUsuarios,TranLecturaUsuarios]);
//Salimos del formulario
Action:=cafree;
End;

Procedure TMaestroUsuariosIndividual.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
Begin
//Averiguamos si podemos cerrar el formulario
If SalirFormularioUsuarios Then Begin
CanClose:=True;//Cerranmos el formulario
End Else Begin
CanClose:=False;//No Cerranmos el formulario
End;
End;


esta puesto tal cual lo tengo...las funciones que aparecen al cerrar el form son comprovaciones para saber si es posible cerrar el formulario(en caso de que este en proceso un ingreso o una modificacion) o para descargar de memoria objetos creados dentro del form...

Se agradece cuanquier ayuda
Saludos....

senpiterno
23-11-2004, 16:33:03
Bueno, ya que veo que nadie me puede ayudar con mi duda, me podrian indicar cual es la forma acostumbrada o mas utilizada para abrir y cerrar formularios MDIChild...

Saludos...

eduarcol
23-11-2004, 16:50:09
Mira primero que todo si no te han contestado es porq quizas nadie sepa la respuesta, me parece muy pronto para
Bueno, ya que veo que nadie me puede ayudar con mi duda,

con respecto a lo que dices

al precionar la X para cerrar el formulario no hacen nada, es mas hasta el formulario contenedor deja de responer cuando lo intento cerrar

por lo que logre entender el problema no es como lo cierras si no alguna de las funciones que incluyes alli porq el comportamiento normal seria que se minimizara no que dejara de responder tal vez debas dpurar paso a paso y nos cuentas que sucede

senpiterno
24-11-2004, 02:43:27
por lo que logre entender el problema no es como lo cierras si no alguna de las funciones que incluyes alli porq el comportamiento normal seria que se minimizara no que dejara de responder tal vez debas dpurar paso a paso y nos cuentas que sucedeEl problema no son las funciones, las he revizado bien y no causan ningun problema, ademas en esas funciones no realizan ninguna operacion que involucre al Form, solo son comprovaciones de los datos que maneja el formulario. Lo extraño del comportamiento de los formularios es que realizan perfectamente las operaciones con los controles que estan contenidos en él, es solo que el boton cerrar no responde y el del form principal tampoco, no es que se queden colgados, sino como explicada, que el evento onclose no se genera al precionar el boton de cerrar...
Que podra estar pasando, quizas sera un problema tenga que ver con las instancias del form que utilizo como plantilla para los MDIChild, tiene alguna ingerencia que todos los form se crean con el mismo nombre, aunque tecnicamente sean instancias diferentes ?....podria estar pasando que al cerrar uno de los MDIChild la aplicacion pierde el foco y ya no puede recuperarlo...
Cualquier ayuda es bien venida, quizas mi tecnica de creacion de los form no es la correcta....

Saludos...

eduarcol
24-11-2004, 16:02:43
Yo sigo creyendo que el problema es de una funcion de hecho debe ser la funcion "SalirFormularioUsuarios" porq el closequery se ejecuta antes que el close, por eso si esa funcion dvuelve falso nunca vas a cerrar el formulario

senpiterno
25-11-2004, 06:14:37
Yo sigo creyendo que el problema es de una funcion de hecho debe ser la funcion "SalirFormularioUsuarios" porq el closequery se ejecuta antes que el close, por eso si esa funcion dvuelve falso nunca vas a cerrar el formularioTienes toda la razon si la funcion "SalirFormularioUsuarios" devulve false nunca saldra del formulario, pero el problema es que ni siquiera se genera el evento OnClosequery, he puesto Break Poin al inicio del evento OnClosequery para ver como se comporta la funcion "SalirFormularioUsuarios" , pero el control del programa nunca llega ahi cuando, preciono cerrar, es por esto que te digo que las funciones incertas en los eventos OnClosequery y OnClose no son el problema, ya que despues de cerrar el primer form hijo, nunca llegan ha generarce dichos eventos al intentar cerrarlos.....Vuelvo a repetir cualquier sugerencia me servira...

Saludos...