Cerrar Formulario Modal al dar clic fuera de él.

637 views
Skip to first unread message

Francisco Lorente

unread,
Mar 9, 2021, 4:01:52 PM3/9/21
to Comunidad de Visual Foxpro en Español
Hola a todos.

¿Se puede cerrar un formulario modal haciendo click fuera de él?

Gracias a todos de antemano.

Saludos.
Francisco Lorente.
Murcia. España.

Daniel Sánchez

unread,
Mar 9, 2021, 4:52:29 PM3/9/21
to Comunidad de Visual Foxpro en Español
Si desde el método deactivate del formulario pones thisform.release

Saludos

--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/0a55d7c9-a938-4f64-9a69-2756eb2e2828n%40googlegroups.com.


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Antonio Meza

unread,
Mar 9, 2021, 5:57:37 PM3/9/21
to Comunidad de Visual Foxpro en Español
Daniel, lo probé pero no me funciono, me imagino que se debe a que al estar el formulario en Modal no permite desactivar el formulario, al menos que le des cerrar.

saludos
Antonio Meza

Víctor Hugo Espínola Domínguez

unread,
Mar 9, 2021, 6:05:55 PM3/9/21
to publice...@googlegroups.com
No veo la utilidad de implementar eso, hacer click fuera del formulario necesita más esfuerzo que hacerlo dentro ;-)

Saludos,
Víctor.
Lambaré - Paraguay.



--

Antonio Meza

unread,
Mar 9, 2021, 6:11:01 PM3/9/21
to Comunidad de Visual Foxpro en Español
jajajajajajaj y si !!!

Allan Raúl Acuña

unread,
Mar 9, 2021, 7:54:36 PM3/9/21
to Comunidad de Visual Foxpro en Español
Me imagino que el usuario quiere que se cierre para agilizar la navegación entre las ventanas. 1 clic menos.

De: publice...@googlegroups.com <publice...@googlegroups.com> en nombre de Antonio Meza <solv...@gmail.com>
Enviado: martes, 9 de marzo de 2021 17:11
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Cerrar Formulario Modal al dar clic fuera de él.
 

Allan Raúl Acuña

unread,
Mar 9, 2021, 7:56:43 PM3/9/21
to Comunidad de Visual Foxpro en Español


De: publice...@googlegroups.com <publice...@googlegroups.com> en nombre de Antonio Meza <solv...@gmail.com>
Enviado: martes, 9 de marzo de 2021 17:11
Para: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Asunto: Re: [vfp] Cerrar Formulario Modal al dar clic fuera de él.
 

Daniel Sánchez

unread,
Mar 9, 2021, 8:42:54 PM3/9/21
to Comunidad de Visual Foxpro en Español
Bueno obvio si es modal bloquea todo, debe ser un no modal para que esos eventos se disparan, como el activate, deactivate, gotfocusy lostfocus

Salud

ZeRoberto

unread,
Mar 9, 2021, 10:49:42 PM3/9/21
to Comunidad de Visual Foxpro en Español
Talvez usando la api mouse_event puedes deducir si hizo click fuera de tu formulario


Saludos

Ze

ZeRoberto

unread,
Mar 9, 2021, 10:57:59 PM3/9/21
to publicesvfoxpro
Me respondo a mi mismo, mouse_event te emula el control del mouse, pero para capturar pudieras usar estas dos funciones GetKeyState para capturar el mouse y GetCursorPos para determinar la posicion del Mouse

Declare Integer GetKeyState In user32 Integer vKey
Declare Integer GetCursorPos In user32 String @lpPoint

Saludos

Ze



Hugo C.

unread,
Mar 9, 2021, 11:06:46 PM3/9/21
to Comunidad de Visual Foxpro en Español
Tal vez sin formularios modales y cerrando el "modal" en el actívate del formulario que lo invoco o en el lostfoucs del mismo modal

Saludos

Francisco Lorente

unread,
Mar 10, 2021, 3:48:46 AM3/10/21
to Comunidad de Visual Foxpro en Español
Gracias a todos por responder.

El tema es que he creado un control que, al pulsar un botón del mismo, despliega un formulario no modal sin barra de título el cual se cierra al perder el foco (a través del evento Deactivate).
Funciona bien cuando el formulario que contien el control es no modal, pero cuando el formulario es modal, ese formulario no modal del control se comporta como si fuese modal y no cierra cuando se pulsa fuera de él.

Probaré con las funciones APi que comenta ZeRoberto y les cuento.

Saludos.
Francisco Lorente.
Murcia. España.


Francisco Lorente

unread,
Mar 10, 2021, 4:05:02 PM3/10/21
to Comunidad de Visual Foxpro en Español

Dejo aquí la solución por si a alguien le pudiera sevir

El el evento init del formulario modal ejecuto la instrucción:

    On Key Label LEFTMOUSE CloseActiveForm()

y en el evento Destroy

    On Key Label LEFTMOUSE


El archivo CloseActiveForm.prg es:

    Local m.lnMouseTop, m.lnMouseLeft, m.lnFormTop, m.lnFormLeft,  m.lnFormBottom, m.lnFormRight
    
    Try
        m.lnMouseTop = GetMousePos(1)                                                                  &&    Posición Y del ratón.
        m.lnMouseLeft = GetMousePos(2)                                                                  &&    Posición X del ratón.
        m.lnFormTop = Objtoclient(_Screen.ActiveForm, 1)                                     &&    Coordenada superior del formulario activo.
        m.lnFormLeft = Objtoclient(_Screen.ActiveForm, 2)                                     &&    Coordenada izquierda del formulario activo.
        m.lnFormRight = m.lnFormLeft + Objtoclient(_Screen.ActiveForm, 3)      &&    Coordenada derecha del formulario activo.
        m.lnFormBottom = m.lnFormTop + Objtoclient(_Screen.ActiveForm, 4)  &&    Coordenada inferior del formulario activo.
       
        &&&&&&&&&&&&&&&&&&&&
        &&
        &&    Si la posición del ratón no coincide con la superficie del formulario activo, cerramos el mismo.
        &&
        &&&&&&&&&&&&&&&&&&&&
       
        If ! Between(m.lnMouseTop, m.lnFormTop, m.lnFormBottom) or ! Between(m.lnMouseLeft, m.lnFormLeft, m.lnFormRight)
            _Screen.ActiveForm.Release()
        EndIf
       
    Catch To m.loError
    EndTry
    
    &&&&&&&&&&&&&&&&&&&&
    &&
    &&    Basado en el código del enlace: https://rahsuarez.wordpress.com/2010/01/25/api-para-mover-el-puntero-del-mouse-en-foxpro-setcursorpos/
    &&
    &&&&&&&&&&&&&&&&&&&&
    
    Function GetMousePos(m.lnPosition)
        Declare Short GetCursorPos In user32 String @ lpPoint
        Local m.lcBuffer, m.lnReturn
       
        lcBuffer = Replicate(Chr(0), 8)
        GetCursorPos(@lcBuffer)
        Do Case
            Case m.lnPosition = 1                                                                &&    Posición Y
                m.lnReturn = buf2dword(Substr(m.lcBuffer, 5, 4))
            Case m.lnPosition = 2                                                                &&    Posición X
                m.lnReturn = buf2dword(Substr(m.lcBuffer, 1, 4))
        EndCase
        Return m.lnReturn
    EndFunc
    
    Function buf2dword(m.tcBuffer)
        Return Asc(Substr(m.tcBuffer, 1, 1));
            + Bitlshift(Asc(Substr(m.tcBuffer, 2, 1)), 8);
            + Bitlshift(Asc(Substr(m.tcBuffer, 3, 1)), 16);
            + Bitlshift(Asc(Substr(m.tcBuffer, 4, 1)), 24)
    EndFunc


A todos, muchas gracias por vuestro esfuerzo en ayudarme.

Saludos.
Francisco Lorente
Murcia. España
Reply all
Reply to author
Forward
0 new messages