Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cerrar componente con ventana modal (https://www.clubdelphi.com/foros/showthread.php?t=26021)

elcigarra 11-10-2005 13:30:26

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?

luisgutierrezb 11-10-2005 18:01:15

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;

Gydba 11-10-2005 18:42:36

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!!

Lepe 11-10-2005 18:49:11

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

elcigarra 11-10-2005 18:51:33

Gracias a los 3.

roman 11-10-2005 19:00:58

Cita:

Empezado por Lepe
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

Si el formulario se muestra modal, el evento OnDeactivate del formulario no se registrará sino hasta después de que termine el estado modal.

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

elcigarra 12-10-2005 02:52:18

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í...
Código Delphi [-]
  
function TMyComp.Execute: Integer;
begin 
  Form1:=TForm1.Create(Self);
  try
    FormCalendar.ShowModal;
  finally
    Result := Form1.SpinEdit1.Value;
    Form1.Free;  // Sentencia que quitaría cuando no es modal
  end;
end;

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.

elcigarra 12-10-2005 13:17:53

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 10:55:38.

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