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

8

Ich portiere eine Delphi 5 App nach D2010, und ich habe ein kleines Problem. Auf einem Formular befindet sich eine TImage-Komponente mit einem OnMouseMove-Ereignis, das ein Label aktualisieren soll, wenn die Maus über das Bild bewegt wird. Dies funktionierte in der ursprünglichen App einwandfrei, aber jetzt wird das OnMouseMove-Ereignis immer dann ausgelöst, wenn sich die Maus über dem Bild befindet, egal, ob es sich bewegt oder nicht, wodurch das Label schrecklich flackert.

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

    
Mason Wheeler 31.12.2009, 19:49
quelle

3 Antworten

5

Mein psychischer Debugging-Sinn sagt mir, dass Sie sich auf Windows befinden, das Label ein Tooltip-Fenster ist und Sie bei jedem Mausklick aktualisieren.

Im Ernst, ich habe diese genaue Sache mit dem Tooltip-Fenster gesehen, als wir zu Vista gewechselt haben. Es scheint, dass neuere Versionen des Windows-Tooltip-Fensters irgendwie WM_MOUSEMOVE-Meldungen generieren, wenn Sie sie aktualisieren. Die einzige Lösung, die ich finden konnte, bestand darin, das Etikett nur zu aktualisieren, wenn sich der Text tatsächlich ändert.

Also, wenn Sie nicht auf Windows sind, Ignorieren Sie mich. Wenn Sie jedoch unter Windows arbeiten, versuchen Sie, den Etikettentext nur zu aktualisieren, wenn er sich tatsächlich ändert.

    
John Knoeller 31.12.2009 20:01
quelle
4

Da ich keinen Kommentar hinzufügen konnte, verwende ich den Antwortabschnitt, um diese Verhaltensänderung zu bestätigen. Ich habe ein Projekt, das in Delphi 2007 entwickelt wurde, wo 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, denn beide werden von WM_MOUSEMOVE ausgelöst.

Was ich tue, bis ich auf den Grund gehe, ist, die vorherigen XY -Koordinaten zu vergleichen und zu beenden, wenn keine Änderung:

%Vor%     
Mitch 13.03.2012 15:28
quelle
1

Mason, ich kann das nicht reproduzieren das ist eine neue D2010 (Update 4 & amp; 5) VCL Forms Anwendung unter Windows XP SP2. Folgendes habe ich getan:

  • Datei | Neu | VCL-Formularanwendung
  • Hat ein TImage und TLabel auf dem Formular
  • abgelegt
  • Für das TImage.Picture
  • wurde ein zufälliges Bild aus dem Standardordner für Bilder (GreenBar.bmp) ausgewählt
  • Doppelklicken Sie im Objektinspektor auf das Ereignis TImage.OnMouseMove und fügen Sie den folgenden Code hinzu:
%Vor%
  • Lief die Anwendung (F9).

Das Etikett zeigte "Label1" (natürlich die Standardbeschriftung), bis ich zuerst die Maus über das Bild bewegte. Es wurde dann korrekt aktualisiert, um die X- und Y-Koordinaten anzuzeigen. Sobald ich den Mauszeiger aus dem Bild bewegte, hörte das Label auf zu aktualisieren.

Es scheint sich um etwas in Ihrem spezifischen Code oder etwas in der von Ihnen verwendeten Windows-Version und nicht um Delphi 2010 selbst zu handeln.

    
Ken White 31.12.2009 20:28
quelle