Subclassing mit Access

Access und die Elemente der Benutzeroberfläche – allen voran Formulare – bieten eine ganze Menge Möglichkeiten, Abläufe durch das Programmieren der vorhandenen Ereignisse zu steuern. Doch nicht immer reichen die vorhandenen Ereignisse aus – so gibt es etwa kein Ereignis, welches das Schließen der Datenbank abfangen würde. Wie Sie dies einrichten, erfahren Sie in diesem Artikel.

Sicher haben Sie auch von den verschiedenen Techniken gehört, mit denen moderne Langfinger versuchen, an Ihr Geld zu kommen: Die setzen kleine Kästchen mit Nummerntastatur auf den Kartenschlitz von Geldautomaten, um die Daten Ihrer EC-Karte und Ihre Geheimnummer zu stehlen. Technisch noch versiertere Kollegen dieser Herren fahren auf der Online-Schiene und bauen sich ihre eigenen Webseiten, die so wie die der jeweiligen Kreditinstitute aussehen, und greifen so die gewünschten Daten ab. Was das mit Access zu tun hat? Ganz einfach: Auch Access tauscht Informationen mit seinen Objekten wie Fenstern und Steuerelementen aus, an die in diesem Fall zwar kein Langfinger, aber vielleicht Sie selbst herankommen wollen, nämlich um sich beispielsweise dazwischenzuklemmen, wenn der Benutzer auf die x-Schaltfläche von Access klickt, um die Anwendung zu beenden, und zwischen diesem Mausklick und dem tatsächlichen Beenden von Access noch eigene Aktionen einzuflechten und zu entscheiden, ob und wie die ursprüngliche Nachricht an Access weitergeleitet wird.

Subclassing-Basics

Wie der Titel andeutet, heißt die hier vorgestellte Technik „Subclassing“. Im Detail benötigen Sie dafür nicht mehr als ein paar API-Funktionen und ein paar Grundkenntnisse über die Besonderheiten beim Subclassing. Die erste API-Funktion heißt SetWindowLong und wird wie folgt deklariert:

Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal wNewLong As Long) As Long

Die Parameter haben folgende Bedeutung:

  • hwnd: Handle auf das Objekt, dessen Nachrichten abgefangen werden sollen.

  • nIndex: Art der Information, die SetWindow- Long liefern soll; hier meist GWL_WNDPROC (- 4).

  • wNewLong: Adresse der Funktion, zu der die Nachricht umgeleitet werden soll.

Der Rückgabewert von SetWindowLong ist die bisherige Adresse. Zwischenspeichern Sie sie in einer Variablen, damit Sie Nachrichten nach der Auswertung gegebenenfalls an den Empfänger weiterleiten und Zieladresse für das betroffene Objekt im Anschluss wieder herstellen können.

Nachricht an Empfänger weiterleiten

Nachdem Sie die Nachricht ausgewertet haben, reichen Sie sie meist an den eigentlichen Empfänger weiter – in diesem Fall an das Access-Fenster. Auch hierzu gibt es eine API-Funktion. Sie heißt CallWindowProc und wird wie folgt deklariert:

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Die Parameter haben folgende Bedeutung:

  • lpPrevWndFunc: Ursprüngliche Zieladresse

  • hwnd: Handle des Objekts

  • msg: Weiterzuleitende Nachricht

  • wParam, lParam: Weitere optionale Parameter