visual reparar puntero prende pero optico mueve luz hace esta encendido coordenadas delphi event-handling delphi-2010 onmousemove

delphi - reparar - mousemove visual basic



¿Por qué OnMouseMove dispara repetidamente cuando el mouse no se mueve en D2010? (3)

Mason, no puedo reproducir esta es una nueva aplicación D2010 (Actualización 4 y 5) VCL Forms en Windows XP SP2. Esto es lo que hice:

  • Archivo | Nuevo | Solicitud de formularios VCL
  • Lanzó un TImage y TLabel en el formulario
  • Elegí una imagen aleatoria de la carpeta de imágenes predeterminada (GreenBar.bmp) para el TImage.Imagen
  • Haga doble clic en el evento TImage.OnMouseMove en el Inspector de objetos y agregue el siguiente código:

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Label1.Caption := Format(''X: %d Y: %d'', [X, Y]); end;

  • Ejecutó la aplicación (F9).

La etiqueta mostraba "Label1" (el título predeterminado, por supuesto) hasta que moví el mouse por encima de la imagen. Luego se actualizó correctamente para mostrar las coordenadas X e Y. Tan pronto como saqué el puntero del mouse de la imagen, la etiqueta dejó de actualizarse.

Parece ser algo en su código específico, o algo específico de la versión de Windows que está utilizando, y no Delphi 2010 en sí.

Estoy portando una aplicación Delphi 5 a D2010, y tengo un pequeño problema. En un formulario se encuentra un componente TImage con un evento OnMouseMove que se supone que debe actualizar una etiqueta cada vez que se mueve el mouse sobre la imagen. Esto funcionó bien en la aplicación original, pero ahora el evento OnMouseMove se dispara constantemente cada vez que el mouse está sobre la imagen, ya sea que se mueva o no, lo que hace que la etiqueta parpadee de forma horrible.

¿Alguien sabe qué está causando esto y cómo solucionarlo?


Mi sentido de depuración psíquica me dice que estás en Windows, la etiqueta es una ventana de información sobre herramientas y estás actualizando en cada mousemove.

Con toda seriedad, he visto esto exactamente con la ventana de información sobre herramientas cuando cambiamos a Vista. Parece que las versiones más recientes de la ventana de información sobre herramientas de Windows generan de alguna manera mensajes WM_MOUSEMOVE cuando los actualizas. La única solución que pude encontrar fue actualizar solo la etiqueta cuando el texto realmente cambia.

Entonces, si no estás en Windows, ignórame. Pero si está en Windows, intente actualizar el texto de la etiqueta solo cuando realmente cambie.


Como no pude agregar un comentario, estoy usando la sección de respuestas para confirmar este cambio de comportamiento. Tengo un proyecto que se desarrolló en Delphi 2007, donde solo se llama al evento OnMouseMove cuando cambia la posición del mouse. Descubrí que con XE OnMouseMove se llama constantemente para obtener el mismo código. No sé por qué, ya que ambos están activados por WM_MOUSEMOVE .

Lo que estoy haciendo hasta llegar al final de esto es comparar las coordenadas XY anteriores y salir si no hay cambios:

if ( x = ZoomRect.Right ) and ( y = ZoomRect.Bottom ) then exit ;