Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 maja 2025, o 20:21


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
    Autor Wiadomość
    PostNapisane: 3 maja 2017, o 14:43 
    Offline
    Nowy

    Dołączył(a): 20 sie 2013
    Posty: 1
    Pomógł: 0

    Witam

    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.
    W tym celu dla każdego panelu przygotowałem zdarzenie OnMouseMove, które sprawdza stan przycisków (funkcja przekazuje parametr Shift: TShiftState).
    Mimo, że instrukcje sprawdzające dla lewego i prawego przycisku myszy są takie same to zachowanie ich jest inne.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
      Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Zachowanie programu:
    *Prawy przycisk myszy - klikniecie i przytrzymanie w dowolnym obszarze okna i przemieszczenie kursora na jeden z paneli powoduję zmianę koloru - reakcja prawidłowa.
    *Lewy przycisk myszy - klikniecie i przytrzymanie w dowolnym obszarze okna i przemieszczenie kursora na jeden z paneli nie powoduję zmianę koloru - reakcja nieprawidłowa. Zmiana koloru następuje jedynie po kliknięciu w obszarach paneli i przemieszczenie kursora o jeden pixel(?).
    W załączniku umieściłem projekt programu.
    Czy ktoś borykał się już z takim problemem? Czy jest prostszy sposób na realizację takiej funkcji?


    Załączniki:

    Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 maja 2017, o 22:03 
    Offline
    Użytkownik

    Dołączył(a): 09 lut 2017
    Posty: 75
    Lokalizacja: 51°03′22″N 15°45′48″E
    Pomógł: 18

    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:
    Składnia: [ Pobierz ] [ Ukryj ]
    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:
    Składnia: [ Pobierz ] [ Ukryj ]
    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. :)


    Załączniki:

    Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO