|
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
|