AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)

Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)

Ein Thema von MicMic · begonnen am 12. Nov 2019 · letzter Beitrag vom 12. Nov 2019
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Was ist hier los? (TListBox, LBN_SELCHANGE, onMouseMove)

  Alt 12. Nov 2019, 01:52
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
  Mit Zitat antworten Zitat
Alt 12. Nov 2019, 02:19     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

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

  Alt 12. Nov 2019, 07:58
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.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

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

  Alt 12. Nov 2019, 09:53
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*
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#4

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

  Alt 12. Nov 2019, 10:10
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 12. Nov 2019, 10:30
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#6

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

  Alt 12. Nov 2019, 10:57
Das wird ja immer besser 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?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

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

  Alt 12. Nov 2019, 13:39
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 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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 12. Nov 2019, 15:30
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

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

  Alt 12. Nov 2019, 16:22
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:25 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