Página 1 de 1
Más ventanas... MDIClient
Publicado: Mar Oct 23, 2007 2:30 pm
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
Más ventanas... MDIClient
Publicado: Mar Oct 23, 2007 5:14 pm
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
Más ventanas... MDIClient
Publicado: Mar Oct 23, 2007 5:51 pm
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
Más ventanas... MDIClient
Publicado: Mar Oct 23, 2007 7:48 pm
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
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 12:50 pm
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
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 1:13 pm
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
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 1:54 pm
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
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 3:21 pm
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. :'(
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 9:25 pm
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
Más ventanas... MDIClient
Publicado: Mié Oct 24, 2007 9:58 pm
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
Más ventanas... MDIClient
Publicado: Jue Oct 25, 2007 9:01 pm
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