Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

El informe se queda en segundo plano

1,960 views
Skip to first unread message

Eva Etxebeste

unread,
Dec 18, 2000, 11:13:55 AM12/18/00
to
Hola a Tod@s

Tengo una aplicación que se basa en un formulario (emergente y modal), que
es el que siempre está cargado. En él he colocado una barra de botones para
poder realizar todos los procesos necesarios sin salir.

Uno de estos botones lanza otro formulario, donde se cargan los límites de
un informe y lanza el informe.

Mi problema es que el informe se lanza, pero se queda debajo de todos los
demás formularios. ¿Cómo puedo hacer que el informe quede en primer plano?

Gracias

Eva.


McPegasus

unread,
Dec 18, 2000, 10:56:17 AM12/18/00
to
Me.Visible = False 'Ocultamos el
formulario


--

Un Saludo y Feliz Navidad

McPegasus
Valencia, España
mcpe...@hotmail.com

Eva Etxebeste

unread,
Dec 18, 2000, 7:35:47 PM12/18/00
to
Lo malo es que detrás hay cuatro formularios: el de entrada a la aplicación
(con su logo y sus historias), el principal (donde veo todos los datos a
partir de los cuales se confecciona el informe), el de captura de límites
para el informe y uno de mensajes que, en principio, no está visible.

Había probado a hacer invisibles tanto el de entrada como el de datos,
maximizando el informe. Una vez cerrado el informe cierro el de captura de
límites, hago visibles el de entrada y el de datos y todos contentos.

Un problema (aunque hay algún otro por parte de los usuarios, que son como
son...):

El formulario que destino a mensajes, que normalmente está invisible hasta
que tengo que mostrar un texto o el progreso de un proceso, ya no se vuelve
a ver. Parece que también se queda por allá al fondo.

Lo que me gustaría es saber cómo puedo traer a primer plano un formulario,
porque con eso se me arreglan los males actuales y futuros

Gracias


McPegasus <mcpe...@hotmail.com> escribió en el mensaje de noticias
ee#9CvQaAHA.1944@tkmsftngp03...

José A. Giménez [Py]

unread,
Dec 18, 2000, 6:00:39 PM12/18/00
to
To tengo el mismo problema y no he conseguido que los informes se queden en
primer plano. He probado con maximizar, ocultar, etc, etc y nada. Posteé la
pregunta varias veces pero parece que no hay remedio.....

--
Feliz Navidad!
José A.Giménez.
Asunción, Paraguay


Jesús López

unread,
Dec 19, 2000, 7:08:09 PM12/19/00
to
Hola Eva:
 
No me gustan los formularios emergentes y como siempre hay otras maneras de hacer las cosas, no los utilizo. De todas maneras a lo mejor te sirve esto:
 
Lo puedes intentar con:

    DoCmd.SelectObject acForm, "El formulario", False 'esto funciona bien si no hay emergentes fastidiando
 
También podrías probar con esta función del API de Windows, pero puede que se produzca algún comportamiento extraño:
 
    SetWindowPos Forms("El formulario").hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE
 
    o
 
    SetWindowPos Forms("El formulario").hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE Or SWP_NOMOVE   
 
Ten en cuenta que:
    Los formularios emergentes siempre están encima de los no emergentes, te pongas como te pongas, para eso son emergentes.
    El orden Z de los formularios emergentes se corresponde siempre con su orden de creación, como si de una pila se tratara. Esto se puede cambiar con la función del API, pero producirá comportamientos extraños.
 
 
Aquí tienes lo necesario para usar la función del API:
 
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
 
Public Const HWND_TOP = 0
Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1

--
Saludos:
 
Jesús López Méndez
 
 
"Eva Etxebeste" <infor...@calcinor.com> escribió en el mensaje news:uEYIHjRaAHA.2256@tkmsftngp05...

Eva Etxebeste

unread,
Dec 20, 2000, 9:39:12 AM12/20/00
to
Hola Jesús
 
Aquí está mi salvador, como siempre :)
 
Agradecida por la respuesta, contraataco: ¿Me puede Vd. explicar las otras maneras de hacer las cosas? Yo utilizo emergentes simplemente para que me respeten el tamaño, no por otra cosa.
 
Un saludo y gracias
 
Eva.
Jesús López <jesu...@navegalia.com> escribió en el mensaje de noticias u5tZothaAHA.2228@tkmsftngp02...

Jesús López

unread,
Dec 20, 2000, 12:56:11 PM12/20/00
to
Hola Eva:
 
Si lo único que necesitas es que se te conserve el tamaño de los formularios, hay dos propiedades que controlan este aspecto:
  • Estilo de los bordes: puedes poner diálogo, así el usuario no puede cambiar el tamaño
  • Ajuste de tamaño automático: si pones sí el formulario se ajusta al área "interna" definida en diseño cuando éste se carga. Si pones no, el tamaño será el tamaño "total" definido en diseño.
Yo suelo utilizar estilo de los bordes diálogo y ajuste de tamaño automático y me va bastante bien.
 
No me gustan los formularios emergentes porque, entre otras cosas, no permiten al usuario pinchar en ningún elemento de las barras de herramientas ni del menú, y yo suelo definir barras de herramientas para cada formulario y un menú personalizado para la aplicación. Además con los emergentes no se puede tener dos o más formularios y cambiar de uno a otro con un click, lo que supone pérdida de funcionalidad.
 
Eva, yo te recomendaría que cuando haces preguntas al grupo, especifiques porqué quieres hacer las cosas, cual es tu objetivo, no pensar en un método determinado para resolver el problema y preguntar cómo llevar a cabo ese método en vez de plantear el problema. Sencillamente porque un problema se puede abordar desde distintos puntos de vista y las soluciones pueden ser múltiples, de esta manera recibirás distintas soluciones y podrás elegir la que más te interesa.

--
Saludos:
 
Jesús López Méndez
 
 
"Eva Etxebeste" <infor...@calcinor.com> escribió en el mensaje news:OqwbDflaAHA.1596@tkmsftngp05...

José A. Giménez [Py]

unread,
Dec 20, 2000, 5:24:48 PM12/20/00
to
El problema es con los informes, no con los formularios
;c)


--
FELIZ NAVIDAD!

Ing. José A.Giménez.
Asunción, Paraguay
gimen...@hotmail.com
(quitar XXX para responder)


Jesús López

unread,
Dec 20, 2000, 7:46:37 PM12/20/00
to
Depende de como quieras verlo, ¿No te parece?.

Se podría decir que el que está fastidiando es el formulario emergente que,
molestando, se queda delante del informe, siendo el desdichado informe "la
víctima inocente del malvado formulario emergente" 8-).

¿Qué es lo que pasa? Pues que los informes no pueden ser emergentes y por lo
tanto no tienen la posibilidad que ponerse delante de ellos. ¿Por qué no
pueden ser emergentes?. Porque si lo fueran no podrían imprimirse pulsando
un botón de la barra de herramientas, ni una opción de menú, ya que las
ventanas emergentes impiden cualquier actividad fuera de ellas, son
demasiado exclusivistas. ¿Qué hacer entonces? yo estoy por utilizar los
formularios emergentes exclusivamente en aquellos casos que sea
estrictamente necesario, es decir, nunca. No me he encontrado aún en la
necesidad de utilizarlos, siempre he podido resolver el problema con
formularios "modales", que no son estrictamente modales como lo son en VB,
sino que son algo menos restrictivos. Yo los llamaría pseudo-modales.

Un Saludo:

Jesús


José A. Giménez [Py] <gimen...@hotmail.com> escribió en el mensaje de
noticias exLbfrsaAHA.1268@tkmsftngp02...

José A. Giménez [Py]

unread,
Dec 20, 2000, 8:58:52 PM12/20/00
to
Sin embargo, en mis aplicaciones funcionan perfectamente pero sólo en una es
que me sucede esto, que el informe (solo dos) se quedan en segundo plano.-
;c)
ya veré como solucionarlo...

Eva Etxebeste

unread,
Dec 21, 2000, 10:06:03 AM12/21/00
to
Hola Jesús
 
Efectivamente, he planteado un caso particular en vez de la pregunta adecuada. Mi problema no era (como muy correctamente apuntas) el informe, sino los formularios emergentes.
 
Y todo esto viene a poner un formulario principal maximizado con el logo de la empresa. Después de esto, todos mis formularios aparecían maximizados, cosa que era penosa a nivel estético. Alguien "me pegó el chivatazo" de que, si los declaraba emergentes, ésto no sucedía. Correcto, no sucede, suceden otras cosas. El peligro de los parches acelerados :(
 
Voy a probar la solución que indicas, no dudo que funcionará perfectamente.
 
Gracias a todos por el interés y el tiempo dedicado
 
Eva.
Jesús López <jesu...@navegalia.com> escribió en el mensaje de noticias u6P4V$qaAHA.2056@tkmsftngp03...

Jesús López

unread,
Dec 21, 2000, 3:50:14 AM12/21/00
to
Tengo una idea para hacer que un informe aparezca en primer plano a pesar de
los formularios emergentes:

Guardas el informe en formato Snapshot
Invocas a Snapshot Viewer mediante Shell y le pasas el nombre del
archivo Snapshot como parámetro.

Debido a que Snapshot Viewer se ejecuta en otro proceso, podrá estar en
primer plano.

"José A. Giménez [Py]" <gimen...@hotmail.com> escribió en el mensaje

news:OTXrGjuaAHA.1920@tkmsftngp05...

Eva Etxebeste

unread,
Dec 21, 2000, 11:35:16 AM12/21/00
to
Hola Jesús

Siento aceptar mi incompetencia. He seguido tus consejos, he declarado los
formularios como no emergentes, con ajuste de tamaño automático y bordes
tipo diálogo. Mi problema sigue ahí, dado que el primer formulario se
presenta maximizado, el resto también aparecen así.

He intentado el parche de colocar docmd.restore al abrir, pero la cosa queda
muuuuuy fea.

La solución sería eliminar el formulario de entrada, que es el que se
muestra maximizado pero, ¿qué hago con todo ese código que quiero ejecutar
sólo una vez al inciar la aplicación?

Gracias

Eva.

Jesús López <Esm...@teleline.es> escribió en el mensaje de noticias
uE3LcqyaAHA.2140@tkmsftngp02...

Jesús López

unread,
Dec 21, 2000, 4:49:50 AM12/21/00
to
    Ahora es cuando entiendo el problema: quieres tener como fondo el logo de la empresa y que lo ocupe todo. Claro, si pones un formulario maximizado para hacer esto, todos los demás formularios no emergentes que abras estarán maximizados. La única solución que se me ocurre es crear un formulario sin bordes que se ajuste al tamaño de la ventana de Access. Cuando se carga el formulario ponemos las propiedades Top y Left a cero para que se ajuste a la esquina superior izquierda y establecemos Width y Height al ancho y alto de la parte cliente de la ventana de Access. No parece sencillo averiguar el tamaño de la ventana de Access. Pero podría servirte la función del API GetClientRect, pasándole como handle de la ventana Application.hWndAccessApp.
 
    Quizá haya otra solución como alguna propiedad dinámica de la base de datos indicando un bitmap o algo así, pero yo no la he encontrado. Sólo he cambiado alguna vez el bitmap de Access que aparece cuando arranca, esto se puede hacer poniendo un bitmap en el mismo directorio que la aplicación y con el mismo nombre de archivo que ésta. Quizá tus usuarios se conformen con esto.
 
    ¡¡¡ Hay que ver la lata que dan las cuestiones de aspecto !!!
 
"Eva Etxebeste" <infor...@calcinor.com> escribió en el mensaje news:#BP0uSyaAHA.236@tkmsftngp04...

Eva Etxebeste

unread,
Dec 21, 2000, 12:30:01 PM12/21/00
to
Sasto, sasto!!!!!!!!!!!! Ahí está el quid de la cuestión!!!
 
Bueno, les pueden dar mucha felicidad a los usuarios y puedo pasar del logo. Y el código inicial lo puedo poner en algún sitio (ya pensaré donde). Lo malo es que tengo otro formulario también maximizado.
 
Joer, la de vueltas que os estoy haciendo dar :(
Jesús López <Esm...@teleline.es> escribió en el mensaje de noticias uiV1vLzaAHA.2100@tkmsftngp02...

Eva Etxebeste

unread,
Dec 21, 2000, 12:33:41 PM12/21/00
to
Sasto, sasto!!!!!!!!!!!! Ahí está el quid de la cuestión!!!
 
Bueno, les pueden dar mucha felicidad a los usuarios y puedo pasar del logo. Y el código inicial lo puedo poner en algún sitio (ya pensaré donde). Lo malo es que tengo otro formulario también maximizado.
 
De momento he arreglado el problema del informe de la siguiente forma:
 
Hago invisibles el formulario de entrada (el del logo) y el principal (se supone que el usuario puede estar trabajando continuamente en éste, ya que puede hacerlo todo desde él) y cierro el formulario de mensajes (que tengo invisible y sólo hago visible para mostrar progresos). Muestro el informe y, al cerrar, hago visibles los dos y abro el de mensajes. Así consigo que el informe quede en primer plano y después todos mantengan el orden correcto.
 
Joer, la de vueltas que os estoy haciendo dar :(
Jesús López <Esm...@teleline.es> escribió en el mensaje de noticias uiV1vLzaAHA.2100@tkmsftngp02...

Carlos Sacristán

unread,
Dec 21, 2000, 7:02:30 AM12/21/00
to
    Acabo de leer que necesitarías saber el tamaño de la ventana de Access. Te escribo la función que utilizo (creo que la saqué de la ayuda) para sacar esas medidas:
 
Public entAltoVentana As Integer
Public entAnchoVentana As Integer
Public entTotalAltoVentana As Integer
Public entTotalAnchoVentana As Integer
Public entAltoEncabezado As Integer
Public entAltoDetalle As Integer
Public entAltoPie As Integer
 
Sub RestablecerTamañoVentana(Formulario As Form)
On Error Resume Next
 
    ' Determinar alto del formulario.
    entAltoEncabezado = Formulario.Section(acHeader).Height
    entAltoDetalle = Formulario.Section(acDetail).Height
    entAltoPie = Formulario.Section(acFooter).Height
 
    entTotalAltoVentana = entAltoEncabezado + entAltoDetalle + entAltoPie
    ' Determinar ancho del formulario.
    entTotalAnchoVentana = Formulario.Width
    ' Determinar alto y ancho de la ventana.
    entAltoVentana = Formulario.InsideHeight
    entAnchoVentana = Formulario.InsideWidth
 
    If entAnchoVentana <> entTotalAnchoVentana Then
        Formulario.InsideWidth = entTotalAnchoVentana
    End If
    If entAltoVentana <> entTotalAltoVentana Then
        Formulario.InsideHeight = entTotalAltoVentana
    End If
 
End Sub

--
----------------------------------------------
Un saludo
 
Carlos S.
Jesús López <Esm...@teleline.es> escribió en el mensaje de noticias uiV1vLzaAHA.2100@tkmsftngp02...

Jesús López

unread,
Dec 21, 2000, 8:18:22 AM12/21/00
to
Quizá podrías evitar tener formularios maximizados si los "pseudomaximizas", o sea, ajustando su tamaño a la parte cliente de la ventana de Access. Aquí tienes el código de la subrutina PseudoMaximizar
 
Option Compare Database
Option Explicit
 
Public Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
 
Public Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
 
Public Const LOGPIXELSX = 88
Public Const LOGPIXELSY = 90
 
Dim TwipsPorPixelX As Long
Dim TwipsPorPixelY As Long
 
Sub ObtTwipsPorPixel()
    Dim hdc As Long
    hdc = GetDC( 0 )
    TwipsPorPixelX = 1440 / GetDeviceCaps( hdc, LOGPIXELSX )
    TwipsPorPixelY = 1440 / GetDeviceCaps( hdc, LOGPIXELSY )
    ReleaseDC 0, hdc
End Sub
 
Sub ObtTamañoVentana( hwnd As Long, Ancho As Long, Alto As Long )
    Dim r As RECT
    ObtTwipsPorPixel
    GetClientRect hwnd, r
    Ancho = r.Right * TwipsPorPixelX
    Alto = r.Bottom * TwipsPorPixelY
End Sub
 
Sub PseudoMaximizar( Formulario As String )
    Dim Ancho As Long, Alto As Long
    ObtTamañoVentana Application.hWndAccessApp, Ancho, Alto
    DoCmd.SelectObject acForm, Formulario, False
    DoCmd.MoveSize 0, 0, Ancho - 4 * TwipsPorPixelX, Alto - 72 * TwipsPorPixelY
End Sub
 
' Lo de los 72 pixels es debido al tamaño de la barra de estado, que no sé cómo averiguarlo
 
Saludos:
 
Jesús
 
 
 
"Eva Etxebeste" <infor...@calcinor.com> escribió en el mensaje news:#spTclzaAHA.2228@tkmsftngp02...

Jesús López

unread,
Dec 21, 2000, 8:21:53 AM12/21/00
to
Gracias Carlos, pero se trataba de la ventana "global" del Access, no de un formulario
"Carlos Sacristán" <csacri...@ocaso.es> escribió en el mensaje news:evuY5W0aAHA.2184@tkmsftngp02...

Hot Budare

unread,
Dec 21, 2000, 12:38:29 PM12/21/00
to
Si lo que necesitas es poder colocar el logo de la compañía como fondo de tu aplicación, hay una página (creo que la de Dev Ashish) que contiene código qur, utilizando llamadas al API, te permiten hacerlo sin necesidad de manipular los formularios de Access. No sé que versión de Access utilizas, pero ese código, hecho para A97, hace uso de un método no soportado para esa versión para obtener AddressOf(). Con A2K tendrías que realizar algunos cambios ya que esta versión SÍ tiene su operador AddressOf. Revísate bien la página de Dev (http://www.mvps.org/access/) y si no lo consigues allí, házmelo saber para revisar mis anotaciones que en este momento no las tengo disponibles.
 
La respuesta del amigo López es bastante adecuada, pero el algoritmo que te indico PODRÍA consumir menos recursos y resultar mas elegante.

--
HTH/EQTA,
T.S.U. Mario Osorio
Punto Fijo, Falcón , Venezuela
Moderador de la lista:
http://www.egroups.com.mx/group/MS-Access-VBA-Espanol
Página personal:
http://www.mipagina.cantv.net/hotbudare/
Jesús López <Esm...@teleline.es> escribió en el mensaje de noticias uiV1vLzaAHA.2100@tkmsftngp02...

Eva Etxebeste

unread,
Dec 22, 2000, 10:28:39 AM12/22/00
to
Gracias a los dos.
 
Junto ambas respuestas y creo que tengo la solución.
 
Con lo que propone Mario elimino el form de entrada (tampoco es imprescindible mostrarlo, simplemente costumbre) y con la respuesta de Jesús puedo "maximizar" el segundo formulario conflictivo.
 
Lo pruebo y os cuento
 
Gracias otra vez
 
Eva.
Hot Budare <hotb...@cantv.net> escribió en el mensaje de noticias eqtU4W3aAHA.2100@tkmsftngp05...

Jesús López

unread,
Dec 24, 2000, 12:10:01 PM12/24/00
to
Ahí va el código para hacer esto:
 
 
 
 
Sub VerInforme(Informe As String)
    Dim Shell As New IWshShell_Class
    DoCmd.OutputTo acOutputReport, Informe, acFormatSNP, Informe & ".snp"
    Shell.Run Informe & ".snp", WshMaximizedFocus, True
End Sub
 
 
Nota: Hay que agregar una referencia a "Windows Scripting Host Object Model" (wshom.ocx). Esta librería se instala con W98, también se puede descargar de la web de Microsoft.

--
Saludos:
 
Jesús López Méndez
 
 
"Jesús López" <Esm...@teleline.es> escribió en el mensaje news:uE3LcqyaAHA.2140@tkmsftngp02...
0 new messages