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.