PDA

Ver la Versión Completa : Problemas con el evento OnMouseDown de TImage


Fran Moreno
12-02-2021, 17:30:22
Hola a todos. Quisiera hacer una pregunta a ver si alguien me puede contestar. Antes que nada decir que solo soy un programador aficionado.
Me ocurre lo siguiente: estoy haciendo un programa en el que dibujo una línea de tiempos, similar a la de los programas de edición de vídeo y/o sonido, que sirve para introducir una serie de datos en el programa en forma gráfica, es decir, el usuario marca diversos puntos en la línea de tiempos que pasan al programa los parámetros de tiempo y nivel, algo como lo que se hace en los programas de edición de sonidos para determinar el volumen del sonido a lo largo del tiempo. Las marcas de nivel entran usando el evento OnMouseDown, que me da los parámetros de posición del puntero.
Dicha línea de tiempos debe poder extenderse hasta una hora de duración, que corresponde a 36000 pixeles de la imagen, ya que cada pixel corresponde a una décima de segundo en la línea de tiempos. También debo desplazar la línea de tiempos en horizontal, dentro de la ventana para poder verla en su totalidad y lo hago también, capturando la imagen en el punto donde se pulsa el botón izquierdo del ratón, dentro del evento OnMouseDown, y arrastrándola con el ratón junto con un panel contenedor.
Todo esto funciona sin problemas siempre que la imagen tenga menos de 32768 pixeles, pues, por alguna razón que desconozco, el evento OnMouseDown del TImage, no se produce si se pulsa más allá del pixel 32767 de la imagen. Esto se traduce en que solo puedo arrastrar la imagen, o introducir marcas en ella, si hago la operación pulsando con el botón izquierdo del ratón, antes del pixel 32768. No es un problema de código, sino que el evento no se genera (Lo he comprobado). En cambio el evento OnContextPopUp del TImage, que también lo utilizo para abrir un menú contextual, si se produce sin problemas, hasta el último pixel de la imagen.
¿Alguien sabe porque pasa esto? 32767 es el valor máximo de una variable de tipo SmallInt, pero yo no uso ninguna variable de este tipo en mi programa. Sospecho que el evento OnMouseDown del TImage, debe utilizar internamente, alguna variable de este tipo. ¿Alguien sabe algo de esto?, ¿Se podría corregir para que el evento OnMouseDown se produzca también a partir del pixel indicado, tal como lo hace el evento OnContextPopUp?
¡Gracias de antemano!

Jair Garza
19-02-2021, 06:19:26
En Delphi 10.2 si funciona el evento OnMouseDown de un TImage con un ancho de 36000 haciendo click en los pixeles finales, así que asumo que si puede ser un bug en la version que usas.
Usas el TImage para cargar una imagen de fondo sobre la cual pintar o solo lo usas como area de dibujo ?

Mi sugerencia como alternativa seria que en lugar de un TImage uses un TPaintBox (en conjunto con un scrollbox para facilitar el desplazamiento horizontal), en el paintbox puedes dibujar la imagen de fondo o mejor aun dibujar por tu cuenta toda la linea de tiempo y sus marcas, esas marcas supongo serán una lista de coordenadas que debes mantener en algún arreglo o estructura.

Tal ves el único inconveniente (u oportunidad) seria que de ti depende hacer todo el dibujado y aprender a utilizar el objeto Canvas del Paintbox con mas detalle.

Fran Moreno
19-02-2021, 20:33:10
Gracias por contestar. Lo cierto es que no cargo imagen en el TImage, sino que dibujo toda la línea de tiempos en el canvas del TImage. Probaré con el TPaintBox y comentaré el resultado