<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=66&amp;t=18318&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-05-04T22:03:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=66&amp;t=18318&amp;mode</id>
<entry>
<author><name><![CDATA[Adam12]]></name></author>
<updated>2017-05-04T22:03:25+01:00</updated>
<published>2017-05-04T22:03:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188448#p188448</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188448#p188448"/>
<title type="html"><![CDATA[Re: [Delphi] OnMouseMove - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188448#p188448"><![CDATA[
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&amp;Drop. <br /><br />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.<br /><br />Drugi sposób to usunięcie flagi csCaptureMouse ze zbioru ControlStyle danego komponentu:<br />[syntax=delphi]procedure TForm1.FormCreate(Sender: TObject);<br />begin<br />  ControlStyle := ControlStyle - &#91;csCaptureMouse&#93;;  //dla Form1<br />  Panel1.ControlStyle := Panel1.ControlStyle - &#91;csCaptureMouse&#93;;<br />  Panel2.ControlStyle := Panel2.ControlStyle - &#91;csCaptureMouse&#93;;<br />end;[/syntax]<br /><br />Działa to jednak chyba tylko dla &quot;nieklikalnych komponentów&quot; 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.<br />Przy większej ilości kontrolek najlepiej zastosować oba sposoby, a wywołanie ReleaseCapture umieścić w osobnej procedurze np:<br />[syntax=delphi]procedure TForm1.ReleaseCaptureMouse(Sender: TObject; Shift: TShiftState; X, Y: Integer);<br />begin<br />  ReleaseCapture;<br />//  SetCaptureControl(nil);<br />end;[/syntax]<br />którą podpinamy pod zdarzenie OnMouseMove każdej pozostałej kontrolki na formie o ile nie wymaga ona jakiejś specjalnej obsługi tego zdarzenia.<br /><br />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. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16417">Adam12</a> — 4 maja 2017, o 22:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Gaek]]></name></author>
<updated>2017-05-03T14:43:56+01:00</updated>
<published>2017-05-03T14:43:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188315#p188315</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188315#p188315"/>
<title type="html"><![CDATA[[Delphi] OnMouseMove - problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18318&amp;p=188315#p188315"><![CDATA[
Witam<br /><br />Chciałbym napisać program, w którym mógłbym kolorować panele (komponent TPanel) za pomocą kliknięcia i przytrzymania (prawego lub lewego) przycisku myszy.<br />W tym celu dla każdego panelu przygotowałem zdarzenie OnMouseMove, które sprawdza stan przycisków (funkcja przekazuje parametr Shift: TShiftState).<br />Mimo, że instrukcje sprawdzające dla lewego i prawego przycisku myszy są takie same to zachowanie ich jest inne.<br /><br />[syntax=Pascal]procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,<br />  Y: Integer);<br />begin<br />if ssLeft in Shift then begin<br />  Panel1.Color:=$FF;<br />  end;<br />  if ssRight in Shift then begin<br />  Panel1.Color:=$FF00;<br />  end;<br />end;<br /><br />procedure TForm1.Panel2MouseMove(Sender: TObject; Shift: TShiftState; X,<br />  Y: Integer);<br />begin<br />if ssLeft in Shift then begin<br />  Panel2.Color:=$FF;<br />  end;<br />  if ssRight in Shift then begin<br />  Panel2.Color:=$FF00;<br />  end;<br />end;[/syntax]<br /><br />Zachowanie programu:<br />*Prawy przycisk myszy - klikniecie i przytrzymanie w dowolnym obszarze okna i przemieszczenie kursora na jeden z paneli powoduję zmianę <span style="color: #40FF00">koloru </span> - reakcja prawidłowa.<br />*Lewy przycisk myszy - klikniecie i przytrzymanie w dowolnym obszarze okna i przemieszczenie kursora na jeden z paneli <strong>nie</strong> powoduję zmianę <span style="color: #FF0000">koloru </span>- reakcja nieprawidłowa. Zmiana koloru następuje jedynie po kliknięciu w obszarach paneli i przemieszczenie kursora o jeden pixel(?).<br />W załączniku umieściłem projekt programu.<br />Czy ktoś borykał się już z takim problemem? Czy jest prostszy sposób na realizację takiej funkcji?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1642">Gaek</a> — 3 maja 2017, o 14:43</p><hr />
]]></content>
</entry>
</feed>