Fehler von WKL-Steuerelementen in VBA behandeln
Fangen Sie die Fehler von WKL-Steuerelementen in Ihrem Code so ab wie die Fehler von Access, zeigen Sie den Benutzern statt eines VBA-Dialogfelds eine verständliche Meldung, und geben Sie die Objekte frei, die Sie halten.
Voraussetzungen: WKL Forms Object Library 1.23 oder höher.
Lösungsüberblick
- Feste Nummern. Jeder Member eines WKL-Steuerelements oder -Objekts, der fehlschlägt, löst einen Laufzeitfehler mit einer festen Nummer aus (
Err.Number, Konstanten vonWklErrorCode) undErr.Source = "WklForms";Err.Descriptionenthält einen Text für den Benutzer in der Sprache der Komponenten oder den eigenen Text von Access, wenn Access abgelehnt hat. - Nummern außerhalb von
WklErrorCode. Ein Fehler, den Access ausgelöst hat, erreicht den Aufrufer mit der eigenen Nummer und dem eigenen Text von Access; Speichermangel ist&H8007000E; jeder andere Fehler, den die Komponenten nicht erwartet haben, ist&H8000FFFFmit „Interner Fehler in der WKL Forms Object Library“ und der Art des Fehlers – melden Sie ihn dem Lieferanten. Gehen Sie inCase Elsenicht davon aus, dass jede Nummer einewke-Konstante ist. On Errorwie gewohnt. Behandeln Sie die Fehler mitOn Error GoToin der Prozedur, die den Member aufruft, und entscheiden Sie anhand vonErr.Number.- Fehler ohne Aufrufer – ein Laden, das beim Zeichnen des Steuerelements fehlschlägt, ein Speichern der Bearbeitung des Benutzers, das die Datenquelle ablehnt – kommen im Ereignis
DataErrorder Struktur- und Rastersteuerelemente und vonWklTokenBoxan;Response = acDataErrContinue(0) unterdrückt das eigene Meldungsfenster des Steuerelements. - Objekte, die Sie halten – eine
WklToastin einerWithEvents-Variablen, einWklLinkManager, einRecordset, das Sie einem Steuerelement übergeben haben –, geben Sie beim Schließen des Formulars mitSet ... = Nothingfrei.
Err.Number | Konstante | Bedeutung |
|---|---|---|
&H80040301 | wkeNotConfigured | Datenquelle oder ein erforderliches Feld fehlt |
&H80040302 | wkeSourceError | Access hat beim Lesen oder Speichern einen Fehler gemeldet (Text von Access in Err.Description) |
&H80040303 | wkeDuplicateKey | Doppelter Schlüssel |
&H80040304 | wkeCycle | Zyklus in der Beziehung zwischen übergeordneten und untergeordneten Elementen |
&H80040305 | wkeKeyNotFound | Kein Knoten und kein Datensatz mit diesem Schlüssel |
&H80040306 | wkeInvalidValue | Ungültiger Wert oder ungültige Datei |
&H80040307 | wkeNotAvailable | Der Befehl ist gerade nicht verfügbar (nicht in der Formularansicht oder nicht für den Datensatz mit dem Fokus) |
Umsetzung
Eine Befehlsschaltfläche, die die ausgewählten Datensätze eines Rasters löscht, mit einer Meldung für die Fälle, die der Benutzer verstehen kann:
Private Sub cmdDelete_Click()
On Error GoTo Failed
Me!Grid1.Object.DeleteSelected
Exit Sub
Failed:
Select Case Err.Number
Case wkeNotAvailable
MsgBox "Bitte zuerst einen Datensatz auswählen.", vbInformation
Case wkeSourceError
MsgBox "Löschen nicht möglich: " & Err.Description, vbExclamation
Case Else
MsgBox "Fehler " & Hex(Err.Number) & " (" & Err.Source & "): " & Err.Description, vbCritical
End Select
End Sub
Eine Ablehnung durch die Datenquelle während der Bearbeitung, angezeigt in der eigenen Statuszeile des Formulars statt in einem Meldungsfenster:
Private Sub Grid1_DataError(ByVal DataErr As Long, ByVal Description As String, Response As Integer)
Me!lblStatus.Caption = Description
Response = acDataErrContinue
End Sub
Freigeben, was das Formular hält:
Private WithEvents mToast As WklToast
Private Sub Form_Load()
Set mToast = New WklToast
End Sub
Private Sub Form_Close()
Set mToast = Nothing
End Sub
Hinweise
- Vergleichen Sie mit den Konstanten, nicht mit negativen Dezimalzahlen:
Err.Numbervon&H80040306ist in VBA-2147220730, und die Konstanten erfordern den Verweis auf WKL Forms Object Library (den Access beim Einfügen eines Steuerelements setzt). - Ein nicht behandelter Fehler in einer Ereignisprozedur zeigt das VBA-Dialogfeld für Laufzeitfehler, wie bei jedem Access-Ereignis; behandeln Sie Fehler auch in Ereignisprozeduren.
- Code, der während eines laufenden Ereignisses desselben Steuerelements einen Member aufruft: Ein Datensatzbefehl von
WklGrid,WklTreeListoderWklGanttläuft dann erst nach der Ereignisprozedur; ein Fehler während seiner Ausführung erreicht den aufrufenden Code daher nicht. Nur seine Verfügbarkeit wird sofort geprüft und löst beim AufrufwkeNotAvailableaus. - Fehlertexte folgen der Sprache der Komponenten (Englisch, Deutsch, Slowenisch, Kroatisch oder Italienisch; Englisch, wenn keine zutrifft), wie ihre übrige Benutzeroberfläche. Entscheiden Sie anhand von
Err.Number, niemals anhand des Texts: Die Nummer bleibt in jeder Sprache gleich. Die Sprache wählen: Sprache der Komponenten festlegen.
Verwandte Themen
de/wiki/msaccess/comctl/how-to/handle-errors-of-wkl-controls.txt · Last modified: by Wolfgang van der Stille