Zusammenfassung
Lernen Sie die versteckten Funktionen des WizHook-Objekts kennen.
Techniken
VBA
Voraussetzungen
Access 2000 und höher
Beispieldatei
wizhook_demo.mdb
Sascha Trowitzsch, Berlin
Der Funktionsumfang von Access ist relativ beschränkt – zumindest wenn man nur die Bordmittel betrachtet. Mit den zahlreichen externen Bibliotheken und ActiveX-Steuerelementen lässt sich Access allerdings fast beliebig erweitern. Manchmal muss man aber gar nicht in die Ferne schweifen: Das WizHook-Objekt liefert einige nützliche Funktionen – allerdings muss man die erst einmal finden.
Der Objektkatalog von VBA – zu erreichen über den VBA-Editor und das Menü Ansicht/Objektkatalog oder die Taste F2 – listet alle Bibliotheken eines VBA-Projekts mitsamt ihren Klassen, Eigenschaften und Methoden auf.
Allerdings können Typbibliotheken einzelne Elemente als „hidden“ deklarieren – sie erscheinen dann zunächst nicht im Objektkatalog. Im Kontextmenü des Katalogs gibt es jedoch einen Eintrag, der es erlaubt, auch diese versteckten Objekte und Methoden sichtbar werden zu lassen (siehe Bild 1).
Bild 1: Anzeigen verborgener Elemente im Objektkatalog
Die versteckten Funktionen werden nach Aktivierung dieses Eintrags in grauer Schrift angezeigt – ein erster Blick in den Objektkatalog offenbart für die Access-Bibliothek eine ganze Menge solcher Einträge. Allerdings gibt es keine Dokumentation zu diesen versteckten Klassen und Methoden, also heißt es: „Selbst ist der Entwickler!“ Sofern das Web oder Fachbeiträge – wie dieser – keinen alternativen Zugang zu Informationen über die versteckten Elemente bieten, bleibt nur der experimentelle Weg.
Microsoft versteckt diese Elemente nicht etwa, weil sie fehlerhaft sind, sondern weil diese Elemente sich gegebenenfalls in neueren Versionen von Access in Funktion oder Syntax ändern. Datenbanken, die diese undokumentierten Elemente einsetzen, würden dann eventuell mit Folgeversionen von Access nicht mehr stabil laufen. Bisher arbeiten jedoch noch alle betroffenen Funktionen auch in Folgeversionen von Access reibungslos.
Unter den „ausgegrauten“ Klassen auf der linken Seite des Objektkatalogs findet sich auch das WizHook-Objekt, das eine stattliche Anzahl Methoden bereithält.
Lange Zeit hielt sich in Newsgroups die Mär, dass diese Klasse nur ein Dummy sei und die Methoden allesamt ohne Funktion seien. Im Jahre 2001 hat schließlich ein Entwickler enthüllt, dass ein spezieller Code gesetzt werden muss, um die Methoden freizuschalten.
Es ist nicht bekannt, ob dieser Code experimentell ermittelt oder durch eine undichte Stelle bei Microsoft nach außen gelangt ist.
Der Schlüssel zu den WizHook-Funktionen ist die Eigenschaft Key der Klasse. Die folgende Zeile schaltet die Funktionen des WizHook-Objekts frei:
WizHook.Key = 51488399 ''magic number
Das Setzen dieses Objekts schaltet die WizHook-Elemente für die Dauer einer Access-Sitzung frei. Da Variablen beim Auftreten nicht behandelter VBA-Fehler jedoch ihren Inhalt verlieren können, hat es sich bewährt, diesen Key vor jedem Aufruf einer Funktion zu setzen – am besten am Anfang einer Prozedur.
Die folgenden Abschnitte erläutern eine Auswahl der interessantesten WizHook-Funktionen, mit denen sich täglich vorkommende Aufgaben leicht lösen lassen (es gibt allerdings noch eine ganze Reihe Methoden, deren Funktionsweise noch nicht hinreichend erforscht wurde). Viele WizHook-Funktionen haben übrigens mit Makros zu tun. Diesen Teil behandelt Access im Unternehmen in einer der folgenden Ausgaben.
Die Funktionen sind in der Beispieldatenbank wizhook_demo.mdb im Modul mdlWizhook zusammengefasst und lassen sich zum größten Teil vom Formular frmWizhook aus aufrufen. Der Name „WizHook“ ist wohl auf die Entstehung dieser Bibliothek zurückzuführen: Die Assistenten von Access 97 (Wizards), die selbst ebenfalls in VBA programmiert sind, enthalten ähnliche Funktionen, die aber in größerem Umfang API-Aufrufe auf die msaccess.exe selbst absetzen.
Microsoft hat sich bei Access 2000 dazu entschlossen, viele dieser API-Aufrufe in COM-Methoden umzuwandeln und in das Objektmodell von Access zu übernehmen.
Eine häufig nachgefragte Funktion ist das öffnen von Dialogen zur Datei- oder Verzeichnisauswahl. Access 2000 hat dies nicht im Angebot und das FileDialog-Objekt (ab Access 2002) ist etwas umständlich zu programmieren.
Man findet daher meist API-basierte Lösungen, die ein umfangreiches Modul benötigen. Dabei lassen sich die Dialoge mit der WizHook-Methode GetFileName mit nur einer einzigen Code-Zeile realisieren:
WizHook.GetFileName(FensterHandle, _ "Microsoft Access", _ "Titel", _ "öffnenButtonText", _ Ergebnisvariable, _ "c:\Startverzeichnis", _ "Dateiendungsfilter", _ FilterIndex, _ ErscheinungsbildIndex, _ Dialogstil, True)
Die Parameter im Einzelnen:
Als Fensterhandle können Sie ohne Bedenken den Wert 0 angeben, da dieser Parameter keine erkennbare Funktion besitzt.
Die Bezeichnung Microsoft Access können Sie genauso gut durch eine andere ersetzen.
Quellcode 1: Mehrere Dateinamen bei Mehrfachauswahl im Dateiauswahldialog erhalten
Dim arrFiles() As String Dim sResult As String Dim ret As Long, i As Long WizHook.Key = 51488399 ret = Wizhook.GetFileName(0&, "", "", "öffnen", sResult, "", _ "(*.*)", 0, 0, 72, True) If ret = 0 Then arrFiles = Split(sResult, vbTab) For i = 0 To Ubound(arrFiles) Debug.Print arrFiles(i) Next i End If
Für Titel setzen Sie einen String ein, der dann in der Titelzeile des Auswahldialogs erscheinen wird.
öffnenButtonText ist ein String, der die Beschriftung des Auswahl-Buttons im Dialog bestimmt. Hier dürfte zumeist „öffnen“ oder „Auswählen“ zum Einsatz kommen.
Ergebnisvariable ist der wichtigste Parameter, denn darin legt der Dialog beim Schließen das Ergebnis ab. Die Variable sollte vom Datentyp String sein.
Startverzeichnis ist ein String mit Pfadangabe. Dieses Verzeichnis wird beim öffnen des Dialogs voreingestellt.
Dateiendungsfilter ist ein String, der eine Verkettung von Filtern zulässt, die dann in der Auswahl-Combobox des Dialogs enthalten sind. Ein einzelner Filter in diesem String baut sich dabei so auf:
"Filterbezeichnung (*.Endung1;*.Endung2)"
Beispiel:
"Grafikdateien (*.bmp;*.gif;*.jpg)"
Wichtig ist die Klammer um die Dateiendungen, die Access zum Ermitteln der Datei benötigt. Die einzelnen Endungen können Sie durch Semikolons oder Kommas trennen. Soll die Combobox des Dialogs mehrere Einträge zur Auswahl bereithalten, so müssen die einzelnen Filterstrings durch das Pipe-Zeichen (|) getrennt werden:
"Word-Dokumente (*.doc,*.rtf)|Excel-Dokumente (*.xls)"
Welcher Filter dann beim öffnen des Dialogs voreingestellt sein wird, gibt der Parameter FilterIndex an – der Wert 0 entspricht dabei dem ersten Eintrag. ErscheinungsbildIndex ist eine Zahl (Datentyp: Long), die angibt, wie der Dialog aussehen soll: Ein Wert kleiner oder gleich 0 liefert eine „Shellview“ in Detailansicht (Liste); bei 1 oder 2 ist die Dateivorschau angeschaltet; bei 3 erhalten Sie eine „Shellview“ als Liste („Kleine Symbole“).
Dialogstil ist eine Summe von Flags, die das Verhalten und das Aussehen des Dialogs bestimmen. Es würde hier zu weit führen, alle Flag-Kombinationen zu beschreiben. Normalerweise verwendet man die Zahl 64. Der Wert 72 erlaubt die Mehrfachauswahl von Dateien.
Beim Klick auf die Abbrechen-Schaltfläche des Dialogs liefert die Funktion GetFileName einen Wert kleiner 0 (beispielsweise -302). Bei Auswahl mindestens einer Datei liefert die Funktion den Wert 0 zurück.
Beim Einsatz der Mehrfachauswahl trennt die Funktion die in der Ergebnisvariablen enthaltenen Dateinamen durch das Tabulator-Zeichen (Chr(9)). Trennen kann man diese etwa mit der VBA-Funktion Split (siehe Quellcode 1).
Sie sehen: Die WizHook-Funktion GetFileName ist eine sehr flexible Möglichkeit zur Anzeige von Dateiauswahldialogen. So flexibel, dass man sie auch für einen Verzeichnisauswahldialog missbrauchen kann: Dazu muss lediglich der Parameter ErscheinungsbildIndex auf 3 gesetzt werden und der Parameter Dialogstil auf 96. Das bewirkt, dass keine Dateien mehr im Dialog angezeigt werden, sondern nur noch Verzeichnisse. Das Aussehen dieses Dialogs weicht zwar vom entsprechenden Standarddialog von Windows ab, aber wenn man sich dadurch ellenlangen API-Code ersparen kann …
Schließlich gibt es noch eine spezielle WizHook-Methode, um Bilddateien auszuwählen (in einer Zeile):
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo