Warsztat: Nietypowy przykład użycia kontrolki kalendarza MSCal.ocx.

RuchomyKalendarzyk.zip
Autor: Krzysztof Naworyta
Baza w formacie MsAccess 97
128kB, 05-11-2001

Kalend4.zip
Autor: Krzysztof Pozorek
Baza w formacie MsAccess 97
97kB, 12-11-2001

RuchomyKalendarzyk2.zip
Autor: Krzysztof Naworyta
Baza w formacie MsAccess 97
65kB, 13-11-2001

RuchomyKalendarzyk2Kv2.zip
Autor: Krzysztof Naworyta
Baza w formacie MsAccess 2000
90kB, 14-11-2001

Opis problemu:

W Accessie jest kontrolka Kalendarz, ale jak z niej korzystać w wygodny dla użytkownika sposób? Czy standardowa kontrolka MSCal.ocx może wyglądać i działać jak w MS Outlook?

Rozwiązanie:

Dość niecodzienny sposób traktowania kontrolki kalendarza podał Krzysztof Naworyta. Jego przykład RuchomyKalendarzyk.mdb to właściwie pretekst do pokazania kilku frapujących i mało popularnych możliwości Accessa. Krzysztof podjął próbę (udaną) przejęcia komunikatów, które dochodzą do wewnętrznej procedury obsługi okna, jaką posiada każdy formularz. Zadanie dość niezwykłe, które daje potencjalne możliwości szersze niż tylko te, wykorzystane w przykładzie. Krzysztof przejął niewykrywalne przez Accessa zdarzenie utraty focusa przez formularz PopUp, ale na podobnej zasadzie można przechwytywać także inne ukryte zdarzenia lub zastępować oryginalne komunikaty naszymi własnymi. Jednak to jest temat na oddzielne opracowanie.

Innym zagadnieniem podjętym przez Krzysztofa w jego przykładzie jest wykorzystanie klas. Mam wrażenie, że programiści rzadko korzystają z tej możliwości w Accessie. Przykład RuchomyKalendarzyk.mdb pokazuje jak oswoić tego "jeża". Na pewno interesujące będzie też dla wielu zagadnienie pozycjonowania jednego formularza względem drugiego. Access nie ma wbudowanych mechanizmów, które to zapewniają. Wszystko to można znaleźć w prezentowanym przykładzie Krzysztofa Naworyty.

A oto co pisze Krzysztof:

Namotałem takie cóś jak DatePicker (uporałem się w końcu z Deactivate, o którym się rozpisywałem na grupie) i mnie się podoba ;-) (to chyba normalne - pierwszy raz zacząłem zabawę z niby klasą i osiągnąłem zamierzone cele) Pytanie czy: - nie można było dużo prościej, - co można "na pierwszy rzut oka" ulepszyć, itd. Prawie wszystko upchnąłem w module formularza Kalendarzyka, choć na pewno warto pewne metody i właściwości przeorganizować (bo było robione trochu łapu-capu)

Krzychu, jestem pod wrażeniem. Jednak mam też wątpliwości, zwłaszcza, ze sam pytasz, czy nie można prościej. To zdecydowanie główna wada Twojego rozwiązania, czyli nadmierne skomplikowanie zagadnienia i w rezultacie chyba brak możliwości wykorzystania Twojego kodu przez mniej doświadczonych programistów. Ale efekt, który uzyskałeś dobrze zachęca do wyjścia poza makra i wizardy. Słowem zagadnienia, które poruszasz dobrze nadają się do celów poznawczych, ale w konkretnym przypadku obsługi kalendarza to chyba za duży nakład środków.

Na podstawie przykładu RuchomyKalendarzyk.mdb postanowiłem napisac zmodyfikowaną wersję bazy o nazwie Kalend4.mdb, która w moich zamierzeniach miała uprościć metodę Krzysztofa przy zachowaniu jej funkcjonalności.

Proponowana przeze mnie zmiana polega na tym, ze zamiast formularza PopUp użyłem okna równorzędnego. Powód jest prosty - w zwykłych, niewyskakujących formularzach nie ma problemu z obsługą zdarzenia Form_Deactivate, co znacznie upraszcza kod. Ale także w przypadku formularzy PopUp kod nie musi być skomplikowany. Dobre efekty daje wykorzystanie Timera do wykrycia aktywności formularza. Nie jest to rozwiązanie ambitne, ale w tym przypadku zupełnie wystarczające. Należy jeszcze powiedzieć o dodatkowych możliwościach zupełnie prostego wykorzystania kalendarza na formularzu pojedynczym. W tym przypadku nie mamy kłopotu z niedogodnością formularzy ciągłych, polegającą na tym, że przypisanie
Me!Kalendarz.Visible = True
w jednym rekordzie, wywołuje taki sam efekt we wszystkich rekordach.

Wszystkie trzy przypadki obsługi kalendarza z wykorzystaniem
- okna PopUp
- okna równorzędnego
- kalendarza na formularzu pojedynczym
zostały przedstawione w przykładzie Kalend4.mdb.


Przykład RuchomyKalendarzyk2.mdb (lub RuchomyKalendarzyk2Kv2.mdb dla Accessa 2000) jest poprawioną wersją kalendarzyka, którą otrzymałem od Krzysztofa Naworyty już po publikacji pierwszego przykładu. Krzysztof dodał kilka ulepszeń, co zwiekszyło funkcjonalność i uniwersalność jego rozwiązania. Ale niech sam zabierze glos:

... dodałem wywoływanie kalendarza ze skrótu klawiaturowego - co nagle podniosło jego funkcjonalność na poziom typowego ctrl+; bardzo mnie cieszy niezależny od modułów innych formularzy efekt pozycjonowania (!) (bez błędów wynikających z pozycji kursora myszki) Dodałem też krótki (?) wstęp, który być może komuś do czegoś się przyda. Tak czy siak - tamto było robocze, to już trochę bardziej cywilizowane. A kalendarzyk ? hmm, jak przegryzę się przez inne problemy, to pewnie zrobię coś co nie będzie odbierało fokusu z okna wołającego - czyli de facto jakąś osadzalną kontrolkę. (Już teraz te raptem kilkadziesiąt kB związanych z dwoma modulikami + frmKal + makro Autokeys stanowią samoistną całość gotową do powielania w każdej nowej bazie !)