In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Más ventanas... MDIClient

Foro de Xailer profesional en español
Responder
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

Si en un Form MDIFrame establecemos el menú oMDIMenu al superar las 9 ventanas MDIClient visualizadas aparece la opción estilo
MFC de "Más ventanas..." lanzando el dialogo "Seleccionar ventana" pero no se selecciona ninguna ventana resultante del dialogo.
Gracias, un saludo
Xavi
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

xAvi escribió:
> lanzando el dialogo "Seleccionar ventana" pero no se
> selecciona ninguna ventana resultante del dialogo.
>
Mejor dicho: selecciona la ventana deseada pero vuelve a activar la que estaba activa antes de entrar en la opción de menú,
dejando la seleccionada por debajo de está.
¿Me he explicado?, ¿Puede probarlo alguien que utilice MDI y el Menú de Ventanas?
Un saludo
Xavi
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Más ventanas... MDIClient

Mensaje por jfgimenez »

Xavi,
he encontrado la solución, pero...
Echa un vistazo a las líneas 720 y posteriores de form.prg (en el método
WMSetFocus()). Verás que hay un comentario mio que indica que hay que dejar
los dos mensajes, uno se envía con SendMessage() y el otro con
PostMessage(). Pues bien, si comentas la llamada a PostMessage() y dejas
solamente la llamada a SendMessage() funciona correctamente.
El problema es que he revisado porqué puse yo eso ahí y no he encontrado la
respuesta. He buscado en nuestro CVS, pero me temo que en esa ocasión no
dejé una nota clara del porqué de los dos mensajes, y como esa modificación
data de enero de 2006, pues francamente, no lo recuerdo.
Lo que puedes hacer es comentar esa línea y seguir trabajando. Si detectas
cualquier otra anomalía respecto a los MDI, por favor, házmelo saber para
volver a hacer pruebas.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

Jose F. Gimenez escribió:
> Lo que puedes hacer es comentar esa lí­nea y seguir trabajando. Si detectas
> cualquier otra anomalí­a respecto a los MDI, por favor, házmelo saber para
> volver a hacer pruebas.
>
Gracias José,
No te preocupes que así­ lo haré.
Mi problema es que utilizo OnActivate para chequeos Time-Spans contra servidor, no es grave (son como pings) pero se me producen
con algo de descontrol y tengo algo más de código metido para solventarlo que tendrí­a que eliminar. Antes tení­a el problema que
al seleccionar un Form por la parte del tí­tulo de la ventana no por el contenido, controles, etc, no se producí­a el evento,
ahora no consigo reproducir el problema con lo que supongo está solventado. También hay código para evitar otras cosas que iban
saliendo como el refresco del menú MDI al ocultar no destruir el form, la edición en forms maximizados y otras cosas que también
me pasa lo mismo, no recuerdo exactamente para que eran.
Un saludo y gracias
Xavi
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Más ventanas... MDIClient

Mensaje por jfgimenez »

Xavi,
ya he encontrado el caso que me obligó a poner las dos llamadas. Para que
quede todo correctamente, tienes que cambiar esas líneas (720 y posteriores)
así:
IF ::Handle == nWParam
PostMessage( hMdiChild, WM_CHILDACTIVATE )
ELSE
SendMessage( hMdiChild, WM_CHILDACTIVATE )
ENDIF
RETURN 0
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

José,
Gracias, ahora lo cambio.
¿Qué tal si programo el siguiente mensaje al finalizar OnHide de mis Forms MDIClients?
Quiero decir si es una buena solución para evitar sobrecargar la lib.
METHOD FormHide( oSender ) CLASS TMyForm
...
...
::oParent:oMdiClient:PostMsg( WM_MDIREFRESHMENU )
RETURN Nil
Un saludo y gracias
Xavi
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Más ventanas... MDIClient

Mensaje por jfgimenez »

Xavi,
> ¿Qué tal si programo el siguiente mensaje al finalizar OnHide de mis Forms
> MDIClients?
> Quiero decir si es una buena solución para evitar sobrecargar la lib.
>
> METHOD FormHide( oSender ) CLASS TMyForm
> ...
> ...
> ::oParent:oMdiClient:PostMsg( WM_MDIREFRESHMENU )
> RETURN Nil
¿Cual es el propósito o el porqué de añadir esto?
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

Jose F. Gimenez escribió:
> ¿Cual es el propósito o el porqué de añadir esto?
>
José,
Si lanzamos un Form MDI y lo cerramos ocultandolo, (estoy hablando siempre de lHideOnClose == TRUE, "Objeto persistente" o su
"filosofí­a" en Xailer) el Menú MDI no se actualiza hasta lanzar otro.
Básicamente detecto la falta de chequeos de lVisible pero como hay cosas que no puedo ver no puedo concretar.
Por ejemplo, a falta del control en el supuesto "WinProc" para evitar la visualización del "WS_SYSMENU" del form si está oculto,
evitando que se ejecuten acciones por teclado .-
METHOD WMCommand( wParam, Handle ) CLASS XForm
...
if( !::lVisible )
return 0
endif
...
RETURN Super:WMCommand( wParam, Handle )
METHOD WMSysCommand( nWParam, nLParam ) CLASS XForm
IF ::lVisible .and. nWParam == SC_CONTEXTHELP
RETURN ::OnHelpClick()
ENDIF
RETURN Nil
¿No sé si he conseguido explicarme?
Un saludo
Xavi
PD: ¿Tampoco sé si es el foro adecuado?, aunque supongo que si. :'(
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

José,
Creo que consigo que me funcione bien el menú de ventanas MDI enviando el mensaje a la cola al final de OnHide y tras la llamada
a Show() de mis Forms lHideOnClose == TRUE, pero claro, confí­o que se llame a DrawMenuBar.
....
::Show(); ::oParent:oMdiClient:PostMsg( WM_MDIREFRESHMENU )
....
Aquí­ se me fue la mano. ¡Eliminar! :)
xAvi escribió:
> METHOD WMSysCommand( nWParam, nLParam ) CLASS XForm
>
> IF ::lVisible .and. nWParam == SC_CONTEXTHELP
> RETURN ::OnHelpClick()
> ENDIF
>
> RETURN Nil
>
Un saludo y gracias
Xavi
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

Perdón,
Me he dejado que en mis códigos también hay una llamada a Next() para conseguir el Foco en la siguiente ventana si existe y es
visible. Serí­a algo así­.-
METHOD FormHide( oSender ) CLASS TMyForm
...
::oParent:oMdiClient:PostMsg( WM_MDIREFRESHMENU )
::oParent:oMdiClient:PostMsg( WM_MDINEXT, 0 )
RETURN Nil
Un saludo
Xavi
xAvi
Mensajes: 108
Registrado: Mar Abr 08, 2008 6:12 pm

Más ventanas... MDIClient

Mensaje por xAvi »

He eliminado el código que restauraba el form si estaba maximizado antes de editar y no sé, ahora no es que pase nada fuera de
lo normal.
xAvi escribió:
> Antes tení­a el problema que al seleccionar un Form
> por la parte del tí­tulo de la ventana no por el contenido, controles,
> etc, no se producí­a el evento, ahora no consigo reproducir el problema
> con lo que supongo está solventado.
>
Si elimino códigos redundantes, no es que no se produzca el evento, es que no se me propaga el PostMessage WM_KEYDOWN lanzado
desde el evento. Teniendo un PostMsg en OnActivate del Form y el evento es provocado por darle click con el mouse a cualquier
control o contenido del Form, Ok, pero si el evento es provocado por darle click a la barra de titulo del form o sus bordes no
se propaga. Curioso no?
Un saludo
Xavi
Responder