Kalendarz.zip
Autor: Leszek Głowala (lglowala@interia.pl)
Baza w formacie MsAccess 97
82kB, 06-08-2003
DatePicker.zip
Autor: Mariusz Sankowski (sanmar@go2.pl)
Baza w formacie MsAccess 97
43kB, 04-08-2003
DatePicker_v11.zip
Autor: Mariusz Sankowski (sanmar@go2.pl)
Baza w formacie MsAccess 97
63kB, 20-08-2003
Opis problemu:
Jak zrobić kalendarzyk w Accessie, żeby nie wymagał instalacji
kontrolek ActiveX?
Kontrolka kalendarzyka to fajna rzecz, jednak przecież nasz program
powinien działać nie tylko na naszym komputerze, ale także na
komputerze użytkownika. A tam oczywiście tej kontrolki nie ma - bo niby
dlaczego ma być, skoro nie instaluje się ona razem z Accessem.
Rozwiązanie:
Wymienione wyżej programy przedstawiają sposób wykonania kalendarzyka bez korzystania z kontrolek ActiveX. Unikamy w ten sposób problemów z instalacja tych komponentów na komputerze użytkownika(!)
Kod zawarty w aplikacji pozwala 'obsłużyć' pole z datą na dwa sposoby:
- używając klawiszy plus i minus na klawiaturze numerycznej,
- wybierając datę z kalendarza, który można otworzyć podwójnym kliknięciem na kontrolce lub kombinacją klawiszy Ctrl + strzałka w dół.
Przydatna może się też okazać funkcja 'OpenMoveForm', która pozycjonuje otwierany formularz wg aktywnej kontrolki lub kursora.
Funkcja 'IsFreeDay' (zbudowana w oparciu o znaleziony w internecie algorytm) wylicza daty Wielkanocy.
O ile pamiętam, na grupie problem ruchomych świąt proponowano rozwiązać przez utworzenie tabeli z wpisanymi odpowiednimi datami. Dzięki
tej funkcji nie jest to konieczne.
Funkcja 'IsFreeDay' jest w module 'mdlCalendar', to dzieki niemu kalendarz pokazuje dni swiateczne.
- baza działa w Acc97, 2000 i XP,
- do zastosowania we własnej aplikacji wystarczy przenieść formularz frmDatePicker i moduł
basDatePicker (niestety cienki jestem w klasach, więc moduł jest standardowy ;-),
- napisałem go po angielsku, żeby było bardziej "internacjonalistycznie"
i PL nie miał kolejnych ton kodu do tłumaczenia ;-),
- rozwiązanie samo w sobie jest międzynarodowe, ponieważ nazwy miesięcy i dni tygodni pobierane są z
funkcji VBA.Format$(...),
- nie jestem dobry w pisaniu komentarzy w kodzie, więc nie ma ich za wiele,
- przyznaję się bez bicia: kilka rowiązań (np. pozycjonowanie kalendarza) jest częściowo oparte na
pomysłach Twoich i KN,
- w moim stylu programowania stosuję pełne odwołania
do bibliotek źródłowych funkcji (np. VBA.Left zamiast Left) aby ograniczać do
minimum skutki bug-u "Missing reference".
- klikając nazwę miesiąca lub rok lewym przyciskiem myszy można wybrać miesiąc z
listy, prawy przycisk umożliwia przewijanie lat,
- pozycjonowanie kalendarza względem obszaru roboczego ekranu tak, aby cały był zawsze widoczny.
Pozdrawiam,
MS
Zmiany w stosunku do poprzedniej wesji:
- numer tygodnia w roku jest zależny od ustawiń systemowych,
- słowo "Dziś:" w etykiecie z bieżącą datą jest
lokalizowane (tzn. wg jezyka ustawi regionalnych),
- kalendrzyk dynamicznie zmiania szerokość w zależności od:
a) długości skrótów nazw dni tygodnia
(np. w języku angielskim skróty systemowe są 3-literowe),
b) długości etykiety z bieżącą datą, która jest zależna od długości słowa "Dziś" i
ustawienia systemowego formatu daty krótkiej,
- menu podręczne z listą miesięcy pojawia się tylko po kliknięciu nazwy miesiąca na "pasku tytułu" i jest
pozycjonowane względem prawego dolnego rogu tej nazwy,
- przyciski przewijania lat pojawiają się tylko po kliknięciu roku i są pozycjonowane
względem pozycji roku (inna pozycja np. dla maja a inna dla października),
- zmiana graficznego zaznaczania wybranej daty i daty bieżącej poprzez
zastosowanie bitmap (aby jeszcze bardziej upodobnić do pierwowzoru),
Ponadto nie podobał mi się efekt fokusu na przyciskach
(wizualnie przycisk z fokusem był mniejszy niż pozostałe), więc zamieniłem je na
obrazy, symulujące przyciski.
Pozdrawiam,
Mariusz Sankowski