Imprimir página | Cerrar ventana

Evento al minimizar un formulario

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86730
Fecha de impresión: 27/Marzo/2026 a las 04:50


Tema: Evento al minimizar un formulario
Publicado por: JGOfisoft
Asunto: Evento al minimizar un formulario
Fecha de publicación: 29/Junio/2023 a las 16:47
Buenas tardes, alguien sabría como ejecutar una determinada acción al minimizar un formulario de Access 2013; o bien minimizar todo el Access al minimizar cualquiera de sus formularios.
Gracias anticipadas.


-------------
Juan Gonzalez



Respuestas:
Publicado por: Mihura
Fecha de publicación: 29/Junio/2023 a las 17:03
Hay un evento que podrías usar:  Al cambiar de tamaño, controlando el tamaño del mismo (altura menor que xxxx) puedes lanzar los comandos que quieras.



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: JGOfisoft
Fecha de publicación: 29/Junio/2023 a las 18:12
LO he intentado pero conserva el tamaño aunque esté minimizado.

If Me.Section(acdetail).Heigt < 100 Then
MsgBox "Formulario minimizado"
End If

Siempre da el tamaño original del detalle del formulario esté o no minimizado


-------------
Juan Gonzalez


Publicado por: Mihura
Fecha de publicación: 29/Junio/2023 a las 18:52
Con Me.InsideHeight te va dando la altura del formulario si cambias el tamaño, pero si lo miniminizas repite ese valor.

Podrías usar eso en el evento, memorizando previamente el valor.

Otra opción que se me ocurre es que elimines los botones de control y te los crees tú.




-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: JGOfisoft
Fecha de publicación: 29/Junio/2023 a las 20:11
Lo que pretendo es minimizar la aplicación desarrollada en access al minimizar cualquiera de sus formularios o informes.
Visto que lo de minimizar no lo consigue que código debería poner en dicho botón, lógicamente este botón habría de ponerse en todos los formulario


-------------
Juan Gonzalez


Publicado por: Mihura
Fecha de publicación: 29/Junio/2023 a las 21:28
    Application.DoCmd.RunCommand acCmdAppMinimize



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: JGOfisoft
Fecha de publicación: 30/Junio/2023 a las 17:15
Perdón por la insistencia, esta acción no hace nada.


Private Sub Minimizar_Click()

    Application.DoCmd.RunCommand acCmdAppMinimize

End Sub



-------------
Juan Gonzalez


Publicado por: joanka
Fecha de publicación: 30/Junio/2023 a las 19:07
Creo que no se puede hacer a partir de Access 2010, solo puedes minimizar el formulario en el que estás.


Publicado por: xavi
Fecha de publicación: 01/Julio/2023 a las 11:11
A mi el acCmdAppMinimize me funciona correctamente en 365 versión 2305 desde la ventana de inmediato.

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: joanka
Fecha de publicación: 01/Julio/2023 a las 11:31
Tienes razón, sí que funciona, el problema es que si lo haces desde un formulario con las propiedades en modo Modal = Si, no funciona.



Publicado por: JGOfisoft
Fecha de publicación: 02/Julio/2023 a las 17:14
Muchas gracias a todos por su ayuda.

Al final y despues de mucho indagar y probar lo he resuelto de la forma, no se si mas ortodoxa pero si suficientemente eficiente.

Para ello he realizado los siguientes pasos:

a) - Se crea una tabla denominada ObjetosAbiertos donde se van añadiendo y quitando aquellos objetos (formularios e informes) que se van abriendo y cerrando; está formada por los siguientes 3 campos:

1 - Campo numércio (clave princiapl) denominado Orden, se van ordenando de forma consecutiva los objetos que se van abriendo.
2 - Campo de texto denominado Tipo, donde se va indicando si el objeto abierto es fromulario o informe.
3 - Campo de texto denominado Nombre, donde se incluye el nombre del objeto abierto.

b) - Se crea en un módulo la función WindowState, que nos sirve para obtener el estado de la ventana en cuestión y una variable pública para referenciar los objetos abiertos.
     La variable y la función son las siguientes:

' Variable de Objeto
Public MisObjetosAbiertos As RecordSet

' Estuctura con información sobre el estado de una ventana
Public Type WINDOWPLACEMENT
    Length As Long
    Flags As Long
    showCmd As Long
End Type

' Función que devuelve el estado de una ventana
Public Function WindowState(hWnd As Long) As Long
Dim WndPl As WINDOWPLACEMENT

    WndPl.Length = Len(WndPl) ' Asignamos una longitud a la estructura WINDOWPLACEMENT. Imprescindible!!!
    If GetWindowPlacement(hWnd, WndPl) Then ' Comprobamos estado de la ventana
        WindowState = WndPl.showCmd ' Devolvemos el estado actual (1 - Normal, 2 - Minimizada, 3 - Maximizada)
    End If ' Final comprobación estado de la ventana

End Function

c) - Seguidamente, en cada formulario e informe he incluido el siguiente código en los eventos siguientes:

1 - Al abrir el formulario:
Private Sub Form_Open(Cancel As Integer)

    DoCmd.SetWarnings False ' Desactivamos mensajes del sistema
    DoCmd.RunSQL "INSERT INTO ObjetosAbiertos ( Orden, Tipo, Nombre ) SELECT Nz(DMax('Orden','ObjetosAbiertos'),0)+1 AS Orden, 'Formulario' AS Tipo, '" & Me.Name & "' AS Nombre;" ' Añadimos objeto abierto
    DoCmd.SetWarnings True ' Activamos mensajes del sistema

End Sub

2 - Al cambiar el tamaño:
Private Sub Form_Resize()
On Error GoTo Error
Dim ObjetoEnfoque As Object

    If WindowState(Me.hWnd) = 2 Then ' Comprobamos estado de la ventana (minimizada)
        Me.Application.DoCmd.RunCommand acCmdAppMinimize ' Minimizamos todo
    Else ' Estado Normal o maximizada
        Set MisObjetosAbiertos = CurrentDb.OpenRecordset("SELECT * FROM ObjetosAbiertos ORDER BY Orden;") ' Obtenemos objetos abiertos
        While (Not MisObjetosAbiertos.EOF) ' Recorremos objetos abiertos
            If MisObjetosAbiertos!TIPO = "Formulario" Then ' Comprobamos tipo de objeto
                Set ObjetoEnfoque = Forms(MisObjetosAbiertos!Nombre): DoCmd.SelectObject acForm, MisObjetosAbiertos!Nombre, False ' Establecemos Objeto y lo seleccionamos
                If MisObjetosAbiertos!Nombre = "Principal" Then DoCmd.RunCommand acCmdAppMaximize Else DoCmd.Restore ' Maximizamos si es el Formulario principal (opciones) o restauramos para el resto de objetos
            Else ' Informe
                Set ObjetoEnfoque = Reports(MisObjetosAbiertos!Nombre) ' Establecemos objeto
                DoCmd.SelectObject acReport, MisObjetosAbiertos!Nombre, False: DoCmd.RunCommand acCmdAppMaximize ' Seleccionamos Objeto y lo restauramos
            End If ' Final comprobación tipo de objeto
            MisObjetosAbiertos.MoveNext ' Pasamos al siguiente objeto abierto
        Wend ' Final recorrido objetos abiertos
        MisObjetosAbiertos.Close: Set MisObjetosAbiertos = Nothing ' Anulamos Recordset de objetos abiertos
        If Not (ObjetoEnfoque Is Nothing) Then ObjetoEnfoque.SetFocus: Set ObjetoEnfoque = Nothing ' Situamos foco y anulamos variable
    End If ' Final comprobación estado ventana

SalirError:
    Exit Sub

Error:
    If Err.Number = 2486 Then Resume Next ' Continuamos para operación no disponible
    Resume SalirError ' Concluimos procedimiento

End Sub

3 - Al descargar excepto en el Menú Principal (Opciones):
Private Sub Form_Close() ' Todos los Objetos

    DoCmd.SetWarnings False ' Desactivamos mensajes del sistema
    DoCmd.RunSQL "DELETE * FROM ObjetosAbiertos WHERE (Tipo='Formulario') AND (Nombre='" & Me.Name & "');" ' Eliminamos Objeto de la tabla ObjetosAbiertos (adecuar Tipo)
    DoCmd.SetWarnings True ' Activamos mensajes del sistema

End Sub

3 - Al descargar el Menú Principal (Opciones):
Private Sub Form_Close() ' Menú Principal

    DoCmd.SetWarnings False: DoCmd.RunSQL "DELETE * FROM ObjetosAbiertos;": DoCmd.SetWarnings True ' Vaciamos la tabla de ObjetosAbiertos

End Sub

Espero que esto ayude a otros, saludos


-------------
Juan Gonzalez



Imprimir página | Cerrar ventana