Ver Mensaje Individual
  #30  
Antiguo 17-09-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Reputación: 13
engranaje Va por buen camino
Por intentar aportar algo os cuento mi opinión,corregidme si me equivoco o no estoy entendiendo algo.

Cuando una aplicación desarrollada en delphi crea ventanas y las muestra al final lo que hace es utilizar la vcl que realmente encapsula la api de windows. Lo que sucede realmente es que utilizando la api crea ventanas y le dice al sistema a que aplicación pertenece y en que orden se muestra dentro de la aplicación.
La cosa puede ser algo mas complejo porque puede darse el caso de que se este mostrando una ventana por encima del resto sin que realmente esta sea la activa, esto puede darse por ejemplo en procesos largos en los que decida mostrarse un form que se vaya actualizando para mostrar cierta información en cada iteración del bucle que realmente se esta actualizando en el form desde el que se llama. Yo he de confesar que hago esto en algunas ocasiones y para evitar este tipo de problemas suelo utilizar DisableTaskWindows y EnableTaskWindows para hacer la ventana que muestra información pseudomodal de modo que permita continuar el proceso desde el que se muestra pero desactive el resto de mensajes.

He de confesar que en ocasiones al crear formularios lo he hecho alegremente sin prestar demasiada atención al parent y al owner del form que se creaba, esto también me ha dado quebraderos de cabeza con el zorder, Lo que suelo hacer ahora y me ha evitado gran parte de ellos es crear los forms cuando sea posible con el form desde el que se llaman como owner y parent , y no con application o nil.

El so tiene un sistema para saber cual es la aplicación activa y para organizar el orden de cada una de las aplicaciones visuales que se estan ejecutando (para saber cual se muestra sobre cual) y a su vez otro para saber para cada aplicación cual es la ventana activa y en que orden se muestran todas esas ventanas. Ese sistema es el que microsoft ha ido cambiando a lo largo de los años esto cambios pueden dar como resultado el comportamiento distinto de la aplicación, ya digo según la versión de la dll que se tenga.

En este caso en particular el problema parece suceder cuando la aplicación pasa a estar inactiva (porque se active otra). Aqui vuelvo a poner una curiosidad, En alguna ocasión me tiene sucedido algo similar cuando desde mi aplicación se pasaba a una aplicación office (word,excel...) y despues volvia a ella, sin embargo todo iba correctametne, cuando alternaba entre mi aplicación y el bloc de notas o el oppen office. Si no me equivoco al volver a activarse la aplicación el so revisa el orden de las ventanas que le consta y activa también la ventana que le consta. En este punto es donde yo creo que esta el problema, es posible que en este punto el so decida que una ventana inactiva se muestre por encima de la activa, igual y dependiendo de la ventana con el teclado o con el traer al frente del administrador de tareas se puede salir del apuro, pero desde luego no con el ratón.

Mi recomendación es comprobar la versión de la User32.dll del cliente en que sucede esto y compararla con la versión de la misma dll de otro cliente en la que no suceda, despues toca revisar la msdn para comprobar si ha habido modificaciones y cuales han sido y tomar las medidas pertinentes.

Última edición por engranaje fecha: 17-09-2014 a las 10:37:02.
Responder Con Cita