8 Stimmen

Warum wird OnMouseMove in D2010 wiederholt ausgelöst, wenn die Maus sich nicht bewegt?

Ich portiere eine Delphi 5-App nach D2010 und habe ein kleines Problem. Auf einem Formular befindet sich ein TImage-Komponente mit einem OnMouseMove-Ereignis, das das Etikett aktualisieren soll, wenn die Maus über das Bild bewegt wird. Dies hat in der Original-App einwandfrei funktioniert, aber jetzt wird das OnMouseMove-Ereignis ständig ausgelöst, wenn die Maus über dem Bild ist, egal ob sie sich bewegt oder nicht, was dazu führt, dass das Etikett schrecklich flackert.

Weiß jemand, was das verursacht und wie man es beheben kann?

5voto

John Knoeller Punkte 32285

Mein psychischer Debugging-Sinn sagt mir, dass du auf Windows bist, das Label ein Tooltip-Fenster ist und du bei jeder Mausbewegung aktualisierst.

Ganz ernsthaft, ich habe genau dasselbe mit dem Tooltip-Fenster gesehen, als wir zu Vista gewechselt haben. Es scheint, dass neuere Versionen des Windows-Tooltip-Fensters irgendwie WM_MOUSEMOVE-Nachrichten generieren, wenn du sie aktualisierst. Der einzige Fix, den ich finden konnte, war, das Label nur dann zu aktualisieren, wenn sich der Text tatsächlich ändert.

Also, wenn du nicht auf Windows bist, ignorier mich. Aber wenn du auf Windows bist, versuche, den Labeltext nur dann zu aktualisieren, wenn er sich tatsächlich ändert.

4voto

Mitch Punkte 325

Da ich keinen Kommentar hinzufügen konnte, verwende ich den Antwortbereich, um diese Verhaltensänderung zu bestätigen. Ich habe ein Projekt, das in Delphi 2007 entwickelt wurde, in dem das OnMouseMove-Ereignis nur aufgerufen wird, wenn sich die Mausposition ändert. Ich habe festgestellt, dass mit XE OnMouseMove ständig für denselben Code aufgerufen wird. Ich weiß nicht, warum, da sie beide durch WM_MOUSEMOVE ausgelöst werden.

Was ich gerade mache, bis ich das auf den Grund gehe, ist der Vergleich der vorherigen XY-Koordinaten und das Verlassen, wenn keine Änderung erfolgt:

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

1voto

Ken White Punkte 120217

Mason, ich kann dies in einer neuen D2010 (Update 4 & 5) VCL Forms-Anwendung unter Windows XP SP2 nicht reproduzieren. Hier ist, was ich gemacht habe:

  • Datei|Neu|VCL Forms-Anwendung

  • Habe ein TImage und TLabel auf das Formular gezogen

  • Habe ein zufälliges Bild aus dem Standardbildordner (GreenBar.bmp) für das TImage.Picture ausgewählt

  • Habe auf das TImage.OnMouseMove-Ereignis im Objektinspektor doppelgeklickt und den folgenden Code hinzugefügt:

    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      Label1.Caption := Format('X: %d Y: %d', \[X, Y\]);
    end;
  • Habe die Anwendung gestartet (F9).

Das Label zeigte "Label1" (den Standardtext) an, bis ich zum ersten Mal die Maus über das Bild bewegt habe. Danach wurde es korrekt aktualisiert, um die X- und Y-Koordinaten anzuzeigen. Sobald ich die Maus aus dem Bild bewegt habe, hat das Label aufgehört, sich zu aktualisieren.

Es scheint etwas Spezifisches in Ihrem Code zu sein oder etwas Spezifisches an der Version von Windows, die Sie verwenden, und nicht an Delphi 2010 selbst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X