Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-10-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: May 2005
Posts: 265
Poder: 14
elcigarra Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 11-10-2005
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: Oct 2005
Ubicación: México
Posts: 908
Poder: 13
luisgutierrezb Va por buen camino
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;
Responder Con Cita
  #3  
Antiguo 11-10-2005
Gydba Gydba is offline
Miembro
 
Registrado: Jan 2004
Ubicación: Argentina
Posts: 673
Poder: 15
Gydba Va por buen camino
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!!
__________________
Suerte
.: Gydba :.
Responder Con Cita
  #4  
Antiguo 11-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: May 2003
Posts: 7.424
Poder: 23
Lepe Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 11-10-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: May 2005
Posts: 265
Poder: 14
elcigarra Va por buen camino
Gracias a los 3.
Responder Con Cita
  #6  
Antiguo 11-10-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.174
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
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
Responder Con Cita
  #7  
Antiguo 12-10-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: May 2005
Posts: 265
Poder: 14
elcigarra Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 12-10-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: May 2005
Posts: 265
Poder: 14
elcigarra Va por buen camino
Perdón.. donde dije "formcalendar.showmodal" debí decir "form1.showmodal" Bueno... eran las 11 de la noche...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 11:57:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi