Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove) (https://www.delphipraxis.net/202504-ist-hier-los-tlistbox-lbn_selchange-onmousemove.html)

MicMic 12. Nov 2019 00:52

Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Hallo,
mir ist kein richtiger Titel eingefallen.
Ich habe mal eine ganz neue Anwendung gemacht um alle Faktoren meines Projekts auszuschließen.

Also eine neue VCL Anwendung.
1. Eine ListBox auf die Form und ein paar Items hinzufügen
2. ListBox mit Ereignis OnMouseMove verbinden und dort ein "Beep" rein.
2. Ein TPanel auf die Form

Folgender Code noch dazu:
Delphi-Quellcode:
type
  TListBox = class(Vcl.StdCtrls.TListBox)
    private
      procedure CNCommand(var AMessage: TWMCommand); message CN_COMMAND;
end;

procedure TListBox.CNCommand(var AMessage: TWMCommand);
begin
  inherited;
  if (AMessage.NotifyCode = LBN_SELCHANGE) then
  begin
    form1.panel1.width := form1.panel1.width + 10;
  end;
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
beep;
end;
Wenn man nun die Maus auf die ListBox bewegt, dann Beep es. Logisch. Lasst mal die Maus auf der ListBox liegen und danach mit den Pfeiltasten andere Items auswählen. Hier wird dann CNCommand / LBN_SELCHANGE gefeuert. Soll ja auch. Dort wird dann das Panel in der Breite immer ein wenig breiter gemacht. Das komische ist nun, dass dadurch OnMouseMove von der TListBox auch ausgeführt wird. Das soll aber nicht und ich verstehe es nicht, wieso das passiert.

Gruß Mic

MicMic 12. Nov 2019 06:58

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1451179)
Gute Nacht MicMic,

hast du eventuell den Maus-Cursor über der Listbox liegen, während du mit den Pfeiltasten durch die Items navigierst?
So könnte ich es eher nachvollziehen, ansonsten nicht, denn das sind komplett unabhängige Abläufe.

Ja, der Mauszeiger liegt hier bei diesem Problem über der ListBox. Es sollte aber so dennoch kein OnMouseMove Event ausgeführt werden. Wenn man das Panel durch ein TButton austauscht "(form1.button1.width := form1.button1.width + 10)" wird ebenfalls OnMouseMove ausgeführt. Bei einem "TLabel" aber nicht. Gerade noch ein wenig weiter getestet. Wenn man CNCommand weglässt und das TPanel einfach in OnKeyUp oder OnKeyDown von der TListBox vergrößert, dann wird auch OnMoveMouse ausgeführt. Ich sehe das irgendwie als Bug von Delphi an.

MicMic 12. Nov 2019 08:53

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Update/Info

Man braucht noch nicht mal eine ListBox.
Neue VCL Anwendung, ein Panel, ein Timer
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 beep;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  panel1.Width := panel1.width + 10;
end;
Befindet sich der Mauszeiger auf der Form direkt (nicht auf dem Panel), wird ständig OnMouseMove gesendet, sobald das Panel in der Breite verändert wird. Dabei sollte doch nur OnMouseMove gesendet werden, wenn sich die Maus wirklich bewegt. Ich kapiere das nicht. *grübel grübel*

Moombas 12. Nov 2019 09:10

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Die Frage dabei ist ja nur, woran wird die "scheinbare" Mouse-Bewegung erkannt?
Ich befürchte, das beim ändern der Größe, das ganze Fenster neu gezeichnet wird, sich dadurch kurzzeitig die Pixel bei der Mouse ändern und somit impliziert wird, das sich diese bewegt hat.

Was passiert denn wenn du das Fenster (z.B. mit den Pfeiltasten) bewegst? Müsstest du natürlich programmieren, aber wenn onMouseMove dann auch auslöst, ist es wahrscheinlich wie ich oben geschrieben habe.

Uwe Raabe 12. Nov 2019 09:30

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Zitat:

Zitat von MicMic (Beitrag 1451185)
Befindet sich der Mauszeiger auf der Form direkt (nicht auf dem Panel), wird ständig OnMouseMove gesendet, sobald das Panel in der Breite verändert wird.

Die Events kommen sogar dann, wenn du die Größe des Panels gar nicht veränderst. Das Vorhandensein eines aktiven Timers genügt.

Moombas 12. Nov 2019 09:57

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Das wird ja immer besser :shock: Mal gut ich musste damit bisher nicht arbeiten^^

@MicMic: Was ist wenn du bei OnMouseMove die Zeigerposition speicherst und mit der vorigen dann immer vergleichst ob sie sich (wirklich) verändert hat und auch erst dann die Kommandos ausführst?

MicMic 12. Nov 2019 12:39

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1451187)
Die Events kommen sogar dann, wenn du die Größe des Panels gar nicht veränderst. Das Vorhandensein eines aktiven Timers genügt.

Nö, nur wenn ein Panel (oder wohl alle anderen mit Fenster-Handle) in der Breite verändert werden. Aber sollte echt nicht sein.

Zitat:

Zitat von Moombas
Was ist wenn du bei OnMouseMove die Zeigerposition speicherst und mit der vorigen dann immer vergleichst ob sie sich (wirklich) verändert hat und auch erst dann die Kommandos ausführst?

Ja, da habe ich schon daran gedacht. Alternativ könnte ich bei mir mein TPanel als TLabel machen. Dann wird auch kein OnMouseMove gefeuert. So oder so... es ist blöd, wenn so ein Event (bei diesem Beispiel > Panel.width...) gefeuert wird. Na hoffentlich kommen nicht noch andere spezielle Überraschungen auf mich zu *lach

Uwe Raabe 12. Nov 2019 14:30

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Zitat:

Zitat von MicMic (Beitrag 1451196)
Zitat:

Zitat von Uwe Raabe (Beitrag 1451187)
Die Events kommen sogar dann, wenn du die Größe des Panels gar nicht veränderst. Das Vorhandensein eines aktiven Timers genügt.

Nö, nur wenn ein Panel (oder wohl alle anderen mit Fenster-Handle) in der Breite verändert werden.

Doch - sonst hätte ich das wohl nicht geschrieben. Könnte natürlich auch an der Delphi- oder Windows-Version liegen.

Alter Mann 12. Nov 2019 15:22

AW: Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)
 
Zitat:

Könnte natürlich auch an der Delphi- oder Windows-Version liegen.
Glaube ich kaum, unter Delphi 2009 und Windows XP ist das gleiche Verhalten zu beobachten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz