Warsztat 4: Zdarzenia w oknach, które nie są prawdziwymi formularzami

dbLightFormEventsSample.zip
Autor: Krzysztof Naworyta
Baza w formacie MsAccess 2003
95kB, 21-12-2008

Zadanie:

Czy chcielibyście mieć kontrolę nad kwerendą/tabelą, porównywalną do tej, jaką mamy w formularzach ?
Czy tabela lub kwerenda może poinformować system, że jest zamykana ?
Czy chciałbyś coś zmienić w innych polach, po zmianie w jakimś polu tabeli/kwerendy ?

Odpowiedź brzmi: Tak! W końcu na jakiej stronie jesteśmy ? Sztuczki i chwyty ! 

Ale po co ?

Pamiętamy, że od czasu access'2000 możemy w formularzu osadzić tabelę/kwerendę jako podformularz, bez potrzeby tworzenia dla nich kolejnego obiektu (formularza).
Poza tym nawet w środowisku Run-Time możemy otworzyć kwerendę przy pomocy DoCmd.OpenQuery.

I nie ma w tym niczego złego.

Rozwiązanie:

Access otwierając tabelę i kwerendę w widoku normalnym musi dla nich stworzyć jakiś grid.
Ten grid to tak naprawdę dobrze nam znany formularz w widoku arkusz danych.
Możemy sprawdzić ten obiekt poprzez przypisanie go do zmiennej:


Dim frm As Form

DoCmd.OpenTable "Table1"

Set frm = Screen.ActiveDatasheet

Okazuje się, że obiekt posiada właściwości dla zdarzeń: OnCurrent, OnUnload itp...
Otwórzmy "Locale Window" i przejrzyjmy co tam się znajduje(!)
Czyli można tam wpisać np. nazwę makra lub własną funkcję publiczną z modułu standardowego lub dowolną funkcję wbudowaną !


frm.OnUnload = "=MsgBox('Zamykamy !')"

Pozostaje już tylko jedno pytanie:
Jak to tak zautomatyzować, by nie musieć pisać nieskończonej ilości funkcji publicznych, dla każdej tabeli/kwerendy osobno.

Odpowiedź jest w modułach przytoczonego przykładu.

Uwaga:

Przy okazji realizacji tego zagadnienia natknąłem się na jeden nowy błąd
Przypomniał się też inny Bug, pojawiający się podczas zmiany rozmiaru formularza głównego.

--
KN