Minimizar todo access al minimizar cualquiera de sus formularios
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