Posible Bug con evento OnContextMenu
Publicado: Vie Abr 08, 2011 11:35 am
Buenos días a todos.
He estado trasteando con el Evento "OnContextMenu" de un objeto y me he dado cuenta que, o bien la ayuda no está bien matizada o el cálculo de coordenadas para situar el objeto "oPopupMenu" es incorrecto.
Para exponer el problema voy a explicar vía imágenes y comentarios paso a paso cómo reproducirlo. Para los interesados, también voy a adjuntar un simple proyecto para que lo puedan descargar y testear en casa.
1. Objetos del formulario
Para empezar he creado un nuevo proyecto, he agregado un formulario y en él he agregado por este orden: Panel1, Splitter, Panel2 Y PopupMenu. El Panel1 tiene un "nAlign := alLEFT" y el Panel2 tiene un "nAlign := alCLIENT"
2. OnContextMenu sobre Panel1
Como se muestra en la imagen he cargado el evento "OnContextMenu" del Panel1 con la instrucción: "::ShowPopupMenu(::oPopupMenu1, nPosX, nPosY)" y lanza perfectamente el menú contextual.
3. OnContextMenu sobre Panel2
He cargado el evento "OnContextMenu" del Panel2 al igual que hice con el Panel1: "::ShowPopupMenu(::oPopupMenu1, nPosX, nPosY)" y lanza el menú contextual, pero erróneo. Véase que el clic derecho lo hice donde se aprecia el punto ROJO.
4. OnContextMenu sobre Panel1 con StatusBar Coordenadas
He repetido el punto 2, pero he agregado un objeto StatusBar en el que muestro las coordenadas actuales sobre el objeto que me muevo. Como puede apreciarse en la siguiente imagen, las coordenadas en las que hago clic derecho son X:11, Y:11 en el Panel1:
5. OnContextMenu sobre Panel2 con StatusBar Coordenadas
Ahora me voy desplazando por el Panel2 y la StatusBar me va pintando las coordenadas del Eje X y Eje Y por las que me encuentro. Puede apreciarse que las coordenadas X e Y son relativas al objeto por el que me desplazo ( algo lógico ). Pero al hacer clic derecho sobre el objeto para mostrar el menú contextual no debería tomar esas coordenadas para mostrar el menú y si que lo hace:
Impresiones
El "problema" viene a raíz del Splitter, puesto que al utilizarlo para crear 2 áreas los objetos del área de la derecha toman sus posiciones de manera relativa al área ( el "nLeft" y "nTop" del objeto en el área de la derecha sigue siendo 0 y 0, pese a estar en mitad del formulario ). Este hecho es correcto en sí mismo, pero invalida el comportamiento del método "ShowPopupMenu(oObjeto, nCoordenadaX, nCoordenadaY)" en cuanto utilices Splitters.
Nada, espero que sirva de algo esta información y os adjunto el proyecto que he usado para la demostración:
Attached files Test.zip (15.8 KB)Â
He estado trasteando con el Evento "OnContextMenu" de un objeto y me he dado cuenta que, o bien la ayuda no está bien matizada o el cálculo de coordenadas para situar el objeto "oPopupMenu" es incorrecto.
Para exponer el problema voy a explicar vía imágenes y comentarios paso a paso cómo reproducirlo. Para los interesados, también voy a adjuntar un simple proyecto para que lo puedan descargar y testear en casa.
1. Objetos del formulario
Para empezar he creado un nuevo proyecto, he agregado un formulario y en él he agregado por este orden: Panel1, Splitter, Panel2 Y PopupMenu. El Panel1 tiene un "nAlign := alLEFT" y el Panel2 tiene un "nAlign := alCLIENT"
2. OnContextMenu sobre Panel1
Como se muestra en la imagen he cargado el evento "OnContextMenu" del Panel1 con la instrucción: "::ShowPopupMenu(::oPopupMenu1, nPosX, nPosY)" y lanza perfectamente el menú contextual.
3. OnContextMenu sobre Panel2
He cargado el evento "OnContextMenu" del Panel2 al igual que hice con el Panel1: "::ShowPopupMenu(::oPopupMenu1, nPosX, nPosY)" y lanza el menú contextual, pero erróneo. Véase que el clic derecho lo hice donde se aprecia el punto ROJO.
4. OnContextMenu sobre Panel1 con StatusBar Coordenadas
He repetido el punto 2, pero he agregado un objeto StatusBar en el que muestro las coordenadas actuales sobre el objeto que me muevo. Como puede apreciarse en la siguiente imagen, las coordenadas en las que hago clic derecho son X:11, Y:11 en el Panel1:
5. OnContextMenu sobre Panel2 con StatusBar Coordenadas
Ahora me voy desplazando por el Panel2 y la StatusBar me va pintando las coordenadas del Eje X y Eje Y por las que me encuentro. Puede apreciarse que las coordenadas X e Y son relativas al objeto por el que me desplazo ( algo lógico ). Pero al hacer clic derecho sobre el objeto para mostrar el menú contextual no debería tomar esas coordenadas para mostrar el menú y si que lo hace:
Impresiones
El "problema" viene a raíz del Splitter, puesto que al utilizarlo para crear 2 áreas los objetos del área de la derecha toman sus posiciones de manera relativa al área ( el "nLeft" y "nTop" del objeto en el área de la derecha sigue siendo 0 y 0, pese a estar en mitad del formulario ). Este hecho es correcto en sí mismo, pero invalida el comportamiento del método "ShowPopupMenu(oObjeto, nCoordenadaX, nCoordenadaY)" en cuanto utilices Splitters.
Nada, espero que sirva de algo esta información y os adjunto el proyecto que he usado para la demostración:
Attached files Test.zip (15.8 KB)Â