![]() |
Cerrar componente con ventana modal
Tengo hecho un componente que contiene una forma modal que se crea y muestra dentro de la función "Execute" del componente.
Lo que quiero es que si el usuario clickea fuera de esta forma modal, la misma se cierre. Para esto intenté infructuosamente lo siguiente: a) Poner en el evento "onmousedown" de la forma que si el mouse estaba fuera de las coordenadas de la ventana, esta se cerrara. Esto no funcionó ya que la ventana no detecta ningún mensaje de mouse que se haga fuera de la ventana (claro... es modal). b) En vez de poner "Sowmodal" mostrarla con "Show" a secas y de esta forma poner el "Close" en el evento OnDeactivate. Esto tampoco funcionó porque por alguna razón cuando uso el componente la ventana no se muestra. Supongo que en algun momento luego de lanzar el "Execute" la ventana pierde el foco y se cierra sola. La ejecución se lanza simplemente con un click de un botón. ¿Existe alguna forma oficial de hacer esto? |
generalmente la ventana se cierra sola porque utilizas algo asi:
forma := Tforma.create(self) forma.show; forma.free; entonces inmediatamente despues del show, la liberas y por eso se cierra, para que no pase eso, quita el forma.free y en el evento OnClose de la forma ponle Action := caFree; |
Buenas,
mmmm... me parece que para mostrarlo modal y hacer lo que pedís del mouse vas a tener que capturar eventos de la aplicación (sobre todo WM_LBUTTONDOWN si te interesa) y saber las coordenas del mouse fuera de la venatana. No recuerdo si el objeto MOUSE refrezcaba las coordenadas, pero podés probarlo. De todas maneras lo más utilizado es cerrar las ventanas con alguna tecla... bah, al menos yo hago eso y me desligo de cualquier problema. Saludos!! |
elcigarra intenta liberarlo desde el evento OnDeactivate, creo que te puede servir, aunque no lo he probado.
En dicho Evento puedes poner form1.ModalResult := mrNo / mrCancel saludos y suerte |
Gracias a los 3.
|
Cita:
Podría usar el evento OnDeactivate de la aplicación pero éste tampoco se registrará si se hace click sobre otro formulario de la aplicación. Lo que quiere hacer lo puede lograr con Show en lugar de ShowModal y poniendo Close en ambos Deactivate. Yo hago esto para simular el comportamiento de un menú con una ventana cualquiera: el menú se cierra cuando se da click en cualquier parte que no sea él mismo. Lo único que tiene que tener cuidado es con lo que ya le indicó luisgutierrezb. // Saludos |
La solución de luisgutierrezb funciona perfecto a lo que yo pregunté, sin embargo el hecho de que la ventana no sea modal genera nuevos problemas.
Algo de código (esquemático). estábamos aquí...
El problema con el Show es que como la aplicación no se detiene en la ventana modal, el resultado de la función Execute se carga con el primer valor del SpinEdit (del Form) y no con el último, no importa como sea que salga. |
Perdón.. donde dije "formcalendar.showmodal" debí decir "form1.showmodal" Bueno... eran las 11 de la noche...:D
|
La franja horaria es GMT +2. Ahora son las 13:05:34. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi