Na początek informacja jak znaleźć klasę WizHook?
O, to żaden problem. Jest ona zawarta w standardowej bibliotece
Accessa (patrz referencje) - wymaganym elemencie każdej bazy.
Zresztą... Nie musimy się troszczyć o odwołania,
bo tej referencji nie da się wyłączyć.
Aby zobaczyć pełną listę funkcji zawartych w klasie WizHook, należy otworzyć dowolny moduł i nacisnąć F2. Wywołany zostanie Object Browser, ale to jeszcze nie wszystko... Teraz naciskamy prawym przyciskiem myszy i wybieramy 'Show Hidden Members' i dopiero wtedy możemy odszukać nasza klasę WizHook.
I co widzimy... Ależ bogactwo funkcji! I to takich, że przecież zawsze nam ich brakowało:
- Function FileExists(File As String) As Boolean
- Sub SaveObject(bstrName As String, objtyp As Integer)
- Function SetVbaPassword(...) As Boolean
- Sub SplitPath(Path As String, Drive As String, Dir As String, File As String, Ext As
String)
- Function TableFieldHasUniqueIndex(Table As String, Columns As String) As Boolean
- Function AccessUserDataDir() As String
- Function GetFileName(...) As Long
- Function GlobalProcExists(Name As String) As Boolean
- itd...
Pamiętamy, ile trzeba było kombinować, żeby rzetelnie sprawdzić, czy
dany plik istnieje. Dir(...)
ze swoimi pułapkami zostawiał co
najmniej niedosyt, a tu wystarczy WizHook.FileExists(File As String)
i po kłopocie.
Następne nazwy funkcji zapowiadają jeszcze większe emocje! Gorączkowo
zabieramy się do testowania pierwszej, najprostszej funkcji, jaką tam znaleźliśmy:
WizHook.CurrentLangID()
i... z wielkim zawodem widzimy 0. Potem
sprawdzamy WizHook.AccessUserDataDir()
, WizHook.FileExists("C:\Autoexec.bat")
i znów rozczarowanie. Te funkcje nie działają...?
Okazuje, się, że Microsoft ustawił jeszcze jedną barierę w dostępie do tych funkcji. One po prostu są uśpione, trzeba je obudzić! W bajkach trzeba było całować księżniczki, tutaj sposób jest nieco bardziej prozaiczny - musimy mieć specjalny klucz, który pozwoli nam wejść do tajemniczego świata tej nieodkrytej klasy. Skąd wziąć ten klucz?
Szczęśliwie znalazł go pewien francuski 'Utter Access
Enthusiast' (skrol29@freesurf.fr), i ogłosił to w wątku na stronie http://www.utteraccess.com.
Oto ten klucz:
WizHook.Key = 51488399
Wystarczy podać go na początku naszego kodu i funkcje z klasy WizHook zostaną uaktywnione!
Oto przykłady użycia niektórych z tych funkcji:
'Sprawdza, czy dany plik istnieje Function CzyPlikIstnieje(Plik As String) As Boolean WizHook.Key = 51488399 'jeśli funkcje zostały 'odblokowane już wcześniej - można klucz pominąć CzyPlikIstnieje = WizHook.FileExists(Plik) End Function
'Sprawdza, czy istnieje procedura o podanej nazwie Function CzyIstniejeProc(strName As String) WizHook.Key = 51488399 CzyIstniejeProc = WizHook.GlobalProcExists(strName) End Function
'Zapisuje określony obiekt accessowy. 'Wartościami AcObjectType mogą być: 'Const acForm = 2 'Const acMacro = 4 'Const acModule = 5 'Const acQuery = 1 'Const acReport = 3 'Const acTable = 0 (itd.) Sub ZapiszObiekt(ObjName As String, ObjType As AcObjectType) WizHook.Key = 51488399 WizHook.SaveObject ObjName, ObjType End Sub
'Sortuje zmienną tablicową Public Function Sortuj() Dim a(1 To 4) As String a(1) = "ddd" a(2) = "bbb" a(3) = "ccc" a(4) = "aaa" WizHook.SortStringArray a() 'Procedura SortStringArray wyjątkowo nie wymaga 'podania klucza WizHook.Key Debug.Print a(1), a(2), a(3), a(4) 'Otrzymamy: aaa, bbb, ccc, ddd End Function
'Rozbija ścieżkę na poszczególne składniki Function RozbijSciezke(sPath As String) Dim sDrive As String, sDir As String, sFile As String, sExt As String WizHook.Key = 51488399 WizHook.SplitPath sPath, sDrive, sDir, sFile, sExt Debug.Print sDrive, sDir, sFile, sExt 'dla RozbijSciezke("C:\BAZY\Dane1.mdb"), otrzymamy: 'sDrive = "C:" 'sDir = "\BAZY\" 'sFile = "Dane1" 'sExt = ".mdb" End Function
'Wylicza pełną ścieżkę na podstawie ścieżki względnej 'w stosunku do bieżącego katalogu Function Sciezka(RelativePath As String) Dim FullPath As String WizHook.Key = 51488399 Call WizHook.FullPath(RelativePath, FullPath) Sciezka = FullPath End Function 'Przykładowo, jeśli bieżącym katalogiem jest C:\Bazy\Mdb\Arch\, 'to Sciezka("..\Dane\") zwróci nam: 'C:\Bazy\Mdb\Dane\
'Zwraca ścieżke do accessowego katalogu użytkownika, np: 'C:\WINDOWS\Profiles\Uzytkownik1\Dane aplikacji\Microsoft\Access\ WizHook.Key = 51488399 WizHook.AccessUserDataDir()
'Zwraca ścieżke do katalogu, w którym instalowane są dodatki AddIns WizHook.Key = 51488399 WizHook.OfficeAddInDir()
'Zwraca identyfikator używanego języka, 'np. jęz. polski ma ID = 1045 WizHook.Key = 51488399 WizHook.CurrentLangID()
'Zwraca informację, czy Tabela1 ma klucz unikalny na polu Id WizHook.Key = 51488399 WizHook.TableFieldHasUniqueIndex("Tabela1", "Id")
'Zakłada hasło na projekt VBA. 'Jest to jedyny (znany mi) sposób, który umożliwia 'założenie hasła na projekt VBA z poziomu kodu! WizHook.Key = 51488399 If WizHook.SetVbaPassword("C:\BAZY\Db1.mdb", "", "aaa") = True Then MsgBox "Założono hasło 'aaa' na projekt VBA w bazie C:\BAZY\Db1.mdb." End If
K. P.