Listener - przechwytywanie zdarzeń

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO

Listener - przechwytywanie zdarzeń

Postprzez Jermor » Śr wrz 01, 2021 1:52 pm

W poście viewtopic.php?f=9&t=5674#p24035 @zett75 zadał pytanie:
Czy istnieje możliwość podświetlania kliknięciem dwóch okienek.

Odpowiedziałem, że trzeba byłoby napisać makro, które przechwytywałoby fakt kliknięcia myszką w wybraną komórkę i na podstawie tego zdarzenia i położenia komórki, podświetlałoby komórkę stowarzyszoną. A dokładniej:
Takie makro musiałoby reagować na zmianę położenia komórki aktywnej. A ta może nastąpić nie tylko przez kliknięcie myszką w komórkę, ale także przez wykorzystanie klawiatury.

Napisałem takie makro. Właściwie to zestaw makr realizujących to zadanie. Znajduje się on w załączonym pliku.
Ponieważ nie znałem żadnych szczegółów, jak miałoby to funkcjonować, kod jest bardziej ogólny. Tak przynajmniej mniemam. Założenie jest następujące:
Użytkownik określa zakres komórek w swoim arkuszu, nazwałem go obszarem aktywnym. Jeśli w tym obszarze zostanie aktywowana komórka, czy to poprzez klikniecie myszką, czy przez użycie klawiatury, w innej komórce, nazwałem ją skojarzoną, pojawi się podświetlenie. Położenie komórki skojarzonej zależy od liczby kolumn i wierszy podanych jako parametr przesunięcia. Podświetleniem komórki skojarzonej jest tło, którego kolor też ustala użytkownik.

Obszar aktywny.
  • Może to być nazwa nadana obszarowi ("Arkusz -> Nazwane zakresy..."), nazwa nadana zakresowi bazy danych ("Dane -> Określ zakres...") i wówczas nie trzeba podawać nazwy arkusza albo zakres komórek podany w tradycyjny sposób (A1:D50). W tym ostatnim przypadku należy podać dodatkowo nazwę arkusza, w którym ten zakres ma być identyfikowany. Jeżeli nazwa arkusza nie zostanie podana, zostanie wykorzystany arkusz, który jest aktywny w momencie uruchomienia makra. Jeżeli nie zostanie podana poprawna nazwa lub źle określono obszar aktywny — pojawi się komunikat "Nie określono obszaru aktywnego." i makro zostanie przerwane.
Komórka skojarzona.
  • Położenie tej komórki wynika z położenia komórki aktywnej w obszarze aktywnym oraz podanego w parametrach przesunięcia ("ilewierszy", "ilekolumn"). Przesunięcie może być liczbą dodatnią albo ujemną. Na podstawie podanych parametrów przesunięcia, makro sprawdza, czy potencjalne komórki skojarzone nie otrzymają adresu poza zakresem arkusza. Gdyby tak było, pojawi się komunikat "Komórka skojarzona poza arkuszem!!!." i makro zostanie przerwane.
Kolor tła.
  • Kolor tła jest podawany jako liczba. W postaci heksadecymalnej każde kolejne dwie cyfry opisują składniki kolorów w kolejności RGB. Np. wartości szesnastkowej D4EA6B odpowiadają wartości R(ed)=212 (D4), G(reen)=234 (EA) i B(lue)-107 (6B), albo po prostu liczba dziesiętna 13953643. Wartość liczbową koloru można odczytać w dowolnym oknie formatowania tła.
    Kolortła.png
    Kliknij, aby powiększyć.

Podane powyżej parametry należy samodzielnie określić w początkowej sekwencji kodu w module.
Constants.png
Kliknij, aby powiększyć.

Oprogramowanie reaguje na kliknięcie lewym przyciskiem myszki oraz na naciśnięcie jednego z klawiszy sterujących komórką aktywną. Są to: strzałki, PageUp, PageDown, Tab, End i Home, przy czym rozpoznawany jest także SHIFT+TAB, a pozostałe klawisze z wykorzystanym CTRL.
Do obsługi zdarzeń napisałem dwie procedury. Jedna włączająca podświetlenie i druga wyłączająca poprzednie podświetlenie. Procedura wyłączająca jest wykonywana po naciśnięciu klawisza, lub przycisku myszki. Procedura włączająca jest wykonywana po zwolnieniu klawisza lub przycisku myszki.
W załączonym pliku zdefiniowałem zwykły zakres ("zakresik"), zakres bazy danych ("MojaBaza" — ten znajduje się w drugim arkuszu). Po uruchomieniu makro "obsługuje" obszar "zakresik".

Aktywowanie procesu.
  • Aby aktywować proces kontroli zdarzeń, należy uruchomić makro InitJM, najlepiej podpiąć je pod akcję otwierania dokumentu. W załączonym pliku makro nie jest aktywowane automatycznie. Można je uruchomić przyciskiem "Włącz kontrolę zdarzeń". Zatrzymanie kontroli można wywołać przyciskiem "Wyłącz kontrolę zdarzeń".

Działania niepożądane.
  • Procedura usuwania tła w komórce skojarzonej, w rzeczywistości usuwa wszystkie atrybuty formatowania tej komórki, także te przypisane wcześniej przez użytkownika, przywracając standardowe atrybuty stylu obowiązującego w komórce. Jeśli więc komórka skojarzona ma zachowywać określony wygląd, to powinna mieć ona (a właściwie cały obszar, w którym może się potencjalnie pojawić) przypisany własny styl.

Uwagi.
  • Jeśli zostaną podane nazwy obszarów, to w przypadku zmiany ich rozmiaru (np. dodanie wiersza) lub położenia, proces będzie działał na zmienionym zakresie, lecz dopiero po zapisaniu pliku i ponownym załadowaniu albo po wyłączeniu kontroli zdarzeń i ponownym włączeniu. Gdy zostanie wprowadzony obszar w postaci adresu bezpośredniego, obszarem aktywnym będzie zawsze ten wskazany zakres komórek. Jeżeli obszar uległ zmianom, należy ponownie wpisać ten zakres.
  • W wyniku wyłączenia kontrolowania może pozostać tło w komórce skojarzonej. Tak się stanie, gdy wyłączenie kontroli zdarzeń nastąpi w innym arkuszu niż ten, w którym zdefiniowany został obszar aktywny. Usunięcie tej pozostałości zrealizuje "Format -> Wyczyść formatowanie bezpośrednie" albo skrót klawiaturowy CTRL+M wykonany na takiej komórce.
Załączniki
JermorHandler.ods
(20.52 KiB) Pobrane 14 razy
AOO 4.1.10, LO 7.1.5 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 1590
Dołączył(a): So paź 12, 2013 11:09 am

Powrót do Makra i programowanie

Kto przegląda forum

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