Wenn das klassische Click-Ereignis nicht mehr reicht
Neue ActiveX-Elemente, WebView2, TreeView, ListView, DatePicker â
die klassischen Formularelemente in Access sind in die Jahre gekommen.
Aber es gibt Alternativen.
Und neue Events.
Und wenn Du darauf sauber reagieren willst, brauchst Du ein paar Tricks.
Warum die Standard-Ereignisse nicht reichen
Access kennt Click
, Change
, AfterUpdate
.
Aber moderne Steuerelemente bringen eigene Events mit.
Beispiel: TreeView-Knoten erweitert, WebView2 lÀdt fertig, DatePicker-Datum gewÀhlt.
Das geht nicht mit [Form_Feldname]_Click()
.
Du brauchst ein Klassenmodul.
Und WithEvents
.
Schritt 1: Das Klassenmodul anlegen
In Access: MenĂŒ â EinfĂŒgen â Klassenmodul
Speichern unter clsTreeHandler
oder Àhnlich
Option Compare Database
Option Explicit
Public WithEvents tvw As MSComctlLib.TreeView
Private Sub tvw_NodeClick(ByVal Node As MSComctlLib.Node)
MsgBox "Knoten: " & Node.Text
End Sub
Private Sub tvw_Expand(ByVal Node As MSComctlLib.Node)
Debug.Print "Erweitert: " & Node.Text
End Sub
Jetzt wird bei Klick und Expand ein Event ausgelöst.
Schritt 2: Instanz im Formular halten
Im Formularmodul brauchst Du eine Objektvariable.
Sonst wird das Klassenobjekt gleich wieder aus dem Speicher geworfen.
Private clsTVW As clsTreeHandler
Private Sub Form_Load()
Set clsTVW = New clsTreeHandler
Set clsTVW.tvw = Me!treeview0.Object
End Sub
Ab jetzt funktionieren die Events aus dem Klassenmodul.
Und Du kannst sie nutzen wie native Ereignisse.
Beispiel: WebView2 â Ladeereignis abfangen
Wenn Du z.âŻB. das neue WebView2-Control eingebunden hast:
' Klassenmodul: clsWebViewEvents
Public WithEvents web As WebView2
Private Sub web_NavigationCompleted(ByVal sender As Object, ByVal args As Object)
MsgBox "Seite geladen."
End Sub
Dann im Formular:
Private clsWeb As clsWebViewEvents
Private Sub Form_Load()
Set clsWeb = New clsWebViewEvents
Set clsWeb.web = Me.WebView2Control.Object
End Sub
Typische Stolperfallen
WithEvents
funktioniert nur mit COM-Objekten, nicht mit Standardmodulen- Wenn Du das Objekt im Formular nicht referenzierst, fliegt das Klassenobjekt raus
- Manche Steuerelemente brauchen ein
.Object
, manche.Value
, manche.Control
Tipp: Direkt TypeName(Me!Steuerelement.Object)
prĂŒfen im Direktfenster
Tabelle: Klassische vs. moderne Ereignisbehandlung
Klassisch (z.âŻB. Textfeld) | Modernes Control (z.âŻB. TreeView) |
---|---|
Sub txtName_AfterUpdate() | Klassenmodul + WithEvents nötig |
Direkte Behandlung im Formular | Indirekte Behandlung ĂŒber Klasse |
Nur Access-Ereignisse | COM-Ereignisse + eigene Event-Objekte |
Kein Lebenszyklus-Management | Klassenvariable nötig |
Erweiterung: mehrere Steuerelemente abbilden
Wenn Du z.âŻB. mehrere TreeViews oder ListViews hast, kannst Du mit Collection arbeiten:
Private colHandlers As Collection
Private Sub Form_Load()
Set colHandlers = New Collection
Dim h1 As New clsTreeHandler
Set h1.tvw = Me!tvwProjekt.Object
colHandlers.Add h1
Dim h2 As New clsTreeHandler
Set h2.tvw = Me!tvwMitarbeiter.Object
colHandlers.Add h2
End Sub
Solange colHandlers
lebt, bleiben auch die Eventhandler aktiv.
Mein Setup fĂŒr moderne Controls mit VBA
Control | Technik |
---|---|
TreeView | MSComctlLib + Klassenmodul |
ListView | MSComctlLib + Events mit Klassenmodul |
WebView2 | WebView2 ActiveX + NavigationCompleted |
DateTimePicker | Microsoft Date and Time Picker Control |
ModernUI (z.âŻB. Office Ribbon) | Callbacks ĂŒber XML + VBA |
Neue Steuerelemente machen Access nicht schöner â aber nĂŒtzlicher.
Und wenn Du weiĂt, wie Du Events richtig kapselst,
dann wirdâs auch stabil.
Nicht klicken. Nicht hoffen.
Sondern kontrolliert reagieren.
No responses yet