Access - Minimizar todo access al minimizar cualquiera de sus formularios

 
Vista:

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Juan González (3 intervenciones) el 30/06/2023 18:01:04
Buenas tardes, tengo desarrollada una aplicación en access 2013 que cuenta con un formulario principal (Menú de Opciones) que se mantiene siempre visible (oculto panel de navegación, barra de estado y ventana de access) y que da acceso a múltiples formularios según la opción pulsada, lo que no puedo conseguir por mas que lo intento es que al minimizar cualquiera de estos formularios, se minimice toda la aplicación de access para dar acceso al escritorio o cualquier otra aplicación que este abierta, ya que al minimizar el formulario activo, este se esconde (no se donde) y no es posible continuar, hay que matar access y volverlo a iniciar.
Le agradecería enormemente su ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Anonimo (3316 intervenciones) el 30/06/2023 19:47:17
Es uno de los problemas que se dan, cuando se oculta la ventana de Access.

Si se desea que se muestre en la barra de tareas cuando este minimizado ¿se ha intentado visibilizar la ventana de Access?, esta propiedad se puede modificar en tiempo de ejecución..

Nada impide volver a ocultarla cuando el formulario recupere su tamaño (cambie su propiedad minimizado).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Juan González (3 intervenciones) el 02/07/2023 17:17:26
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
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Anonimo (3316 intervenciones) el 02/07/2023 19:36:06
Creo que lo has complicado un poco, los objetos formulario abiertos están en la colección 'AllForms' que maneja Access de forma optima (y se acostumbra a utilizar para verificar los que están abiertos).

Se pretende que al minimizar el ultimo se haga visible el icono de Access en la barra de tareas y ello es tan sencillo como hacer visible a la ventana de Access que suele ocultarse con la función apiShowWindow y que admite cambiar la ventana de Access de visible a invisible en tiempo de ejecución.

Si no se esta utilizando esa función (habrá mas métodos para lograr ese efecto) queda descartado mi planteamiento.

De cualquier forma gracias por por publicar la solución que te ha resuelto el problema, le puede ser útil a mas de uno y de dos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Juan González (3 intervenciones) el 08/07/2023 13:51:15
Muchas gracias por tu opinión, me podrías dar una pincelada de como utilizar esa colección (AllForms) para obtener el objetivo indicado.
A lo mejor no es necesaria la tabla de ObjetosOcultros ni tanto código.
Gracias de antemano y saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Minimizar todo access al minimizar cualquiera de sus formularios

Publicado por Anonimo (3316 intervenciones) el 09/07/2023 01:42:55
Un ejemplo que muestra en la ventana de inmediato el nombre de los formularios abiertos utilizando la colección AllForms

1
2
3
4
5
6
Function FormsOpen() As Long
Dim obj As AccessObject
For Each obj In Application.CurrentProject.AllForms
    If obj.IsLoaded = True Then Debug.Print obj.Name
    Next obj
End Function

Puedes acceder a las propiedades, contarlos etc. y si se cumplen las condiciones se puede hacer visible la ventana de Access (aparecerá en la barra de tareas), nada impide hacerla invisible nuevamente si cambian las condiciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar