Dzieje się tak dlatego, że kliknięta kontrolka lub forma powoduje przetrzymanie komunikatu myszy tylko dla siebie. Można to łatwo sprawdzić odczytując na bieżąco parametry X,Y w zdarzeniu OnMouseMove. Po wciśnięciu lewego klawisza można jeździć kursorem po innych kontrolkach a i tak działa tylko kod zdarzenia kontrolki na której został wciśnięty lewy klawisz myszy. Zachowanie jest inne dla prawego klawisza, ale tak to już jest urządzone w Windowsie i ma to prawdopodobnie związek z Drag&Drop.
Są na to różne sposoby. Najprościej dla każdej kontrolki oraz głównej formy w zdarzeniu OnMouseMove wywołać procedurę ReleaseCapture lub SetCaptureControl(nil). Powoduje to zwolnienie tego przetrzymania. Dla tej drugiej procedury parametr (nil) oznacza brak przetrzymującej kontrolki. Jeśli zmienimy to np. na SetCaptureControl(Button1) to nastąpi przejęcie komunikatów przez Button1.
Drugi sposób to usunięcie flagi csCaptureMouse ze zbioru ControlStyle danego komponentu:
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Działa to jednak chyba tylko dla "nieklikalnych komponentów" jak forma, panel. Dla przycisku i tak trzeba stosować ReleaseCapture. Jeśli jednak założymy, że wciśnięcie klawisza nastąpi w obrębie formy lub jednego z paneli to ten sposób może być wystarczający.
Przy większej ilości kontrolek najlepiej zastosować oba sposoby, a wywołanie ReleaseCapture umieścić w osobnej procedurze np:
język delphi
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
którą podpinamy pod zdarzenie OnMouseMove każdej pozostałej kontrolki na formie o ile nie wymaga ona jakiejś specjalnej obsługi tego zdarzenia.
W załączniku poprawiony program w wersji z csCaptureMouse i procedurą ReleaseCaptureMouse podpiętą do OnMouseMove Buttona1. Przy okazji trochę się pobawiłem i dodałem obsługę wciśnięcia dwóch klawiszy na raz.