** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Evento al minimizar un formulario
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Evento al minimizar un formulario

 Responder Responder
Autor
Mensaje
JGOfisoft Ver desplegable
Nuevo
Nuevo


Unido: 20/Agosto/2015
Localización: España
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JGOfisoft Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Evento al minimizar un formulario
    Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
JGOfisoft Ver desplegable
Nuevo
Nuevo


Unido: 20/Agosto/2015
Localización: España
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JGOfisoft Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
JGOfisoft Ver desplegable
Nuevo
Nuevo


Unido: 20/Agosto/2015
Localización: España
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JGOfisoft Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 14428
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 29/Junio/2023 a las 21:28
    Application.DoCmd.RunCommand acCmdAppMinimize

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

Access Aplicaciones
Tecsys.es
Arriba
JGOfisoft Ver desplegable
Nuevo
Nuevo


Unido: 20/Agosto/2015
Localización: España
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JGOfisoft Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
joanka Ver desplegable
Habitual
Habitual


Unido: 07/Abril/2021
Localización: Lleida
Estado: Sin conexión
Puntos: 144
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita joanka Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
joanka Ver desplegable
Habitual
Habitual


Unido: 07/Abril/2021
Localización: Lleida
Estado: Sin conexión
Puntos: 144
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita joanka Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.

Arriba
JGOfisoft Ver desplegable
Nuevo
Nuevo


Unido: 20/Agosto/2015
Localización: España
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JGOfisoft Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable