Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2006.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Lernen Sie die versteckten Funktionen des WizHook-Objekts kennen.

Techniken

VBA

Voraussetzungen

Access 2000 und höher

Beispieldatei

wizhook_demo.mdb

WizHook - versteckte Features in Access

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.

Versteckte Funktionen

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 (s. Abb. 1).

Abb. 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.

Die WizHook-Klasse

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.

Auswahldialoge

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):

WizHook.OpenPictureFile 
Ergebnisvariable, 0

Kürzer geht's nicht! Der damit aufgerufene Auswahl-Dialog entspricht im Erscheinungsbild dem üblichen Öffnen-Dialog. Die Auswahl-Combobox enthält aber bereits eine Reihe Filter für Grafikdateien. Nachteilig ist nur, dass die Vorschau im Dialog nicht voreinstellbar ist.

Pfadfunktionen

Wer weiß, wie viele Entwickler schon eine Hilfsfunktion zum Trennen von Verzeichnis und Dateiname bei Pfadangaben programmiert haben - dabei liefert Access diese Funktion und weitere frei Haus. Sehen Sie einfach selbst!

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.