Befehle durch eigene ersetzen

Letzte Änderung am 8. April 2021 by Christoph Jüngling

Auch wenn VB6 inzwischen etwas in die Jahre gekommen ist, kann man wie gesagt einige nette Sachen damit anstellen. Eines davon mag überraschen, aber “Function Overloading” geht tatsächlich! Und das geht so.

Mal angenommen, wir hätten an unzähligen Stellen die Funktion MsgBox verwendet, um unglücklicherweise direkt mit dem Benutzer zu kommunizieren. Angenommen ferner, wir hätten damals (manche Programme sind halt schon etwas länger in Gebrauch) noch nichts von Model-View-Controller oder auch MVVM gehört. Nehmen wir weiterhin an, dass unser Auftrag darin bestünde, die Oberfläche ungeachtet aller dummen Fehler der Vergangenheit so umzubauen, dass das Programm durch einen Kommandozeilenaufruf gestartet und gesteuert werden könnte. Und natürlich darf es fast nichts kosten.

Dann bestünde das große Problem, dass wir an vielen Stellen auf den Benutzer warten würden, der aber nicht kommt, weil er gerade schläft. Denn es ist Nacht, und die Preußen kommen auch nicht. Was also tun?

Nun, die Sache ist ganz einfach: Wir schreiben uns eine eigene Funktion und nennen sie ebenfalls MsgBox(). Wichtig ist dabei, dass diese Funktion nicht nur genauso heißt, sondern auch die gleichen Aufrufparameter hat. Nur so ist sichergestellt, dass sie sich zumindest nach außen hin gleich verhält und keine Syntaxfehler provoziert. Wir machen uns das Prinzip zu Nutze, dass das VB- und VBA-Laufzeitsystem immer zuerst in unserem eigenen Programmcode nach Funktionen sucht. Erst wenn es hier nicht fündig wird, sucht es in den per Verweis angebundenen Bibliotheken.

Unsere Funktion könnte z.B. so aussehen:

''
' Override MsgBox function to prevent it from being displayed
' in case of remote controlled program
'
' @see Interaction.MsgBox()
' @author Christoph Juengling
'
Public Function MsgBox( _
    Prompt As String, _
    Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
    Optional title As String = "", _
    Optional HelpFile As Variant, _
    Optional Context As Variant _
) As Integer

Dim result As Integer
Dim buttonarray As Variant

'------------------------

result = vbOK

If RemoteControl Then 
' Do not display the message box, because program is beeing
' remotely controlled

' Build the correct return code for the default button
    Select Case Buttons And
        Case vbOKOnly: buttonarray = Array(vbOK)
        Case vbOKCancel: buttonarray = Array(vbOK, vbCancel)
        Case vbAbortRetryIgnore: buttonarray = Array(vbAbort, vbRetry, vbIgnore)
        Case vbYesNo: buttonarray = Array(vbYes, vbNo)
        Case vbYesNoCancel: buttonarray = Array(vbYes, vbNo, vbCancel)
    End Select

    Select Case Buttons And 1008
        Case vbDefaultButton1: result = buttonarray(0)
        Case vbDefaultButton2: result = buttonarray(1)
        Case vbDefaultButton3: result = buttonarray(2)
        Case vbDefaultButton4: result = buttonarray(3)
    End Select
Else
    If title = "" Then title = strMsgTitle
    result = Interaction.MsgBox(Prompt, Buttons, title, HelpFile, Context)
End If

MsgBox = result

End Function

Im Falle einer Fernsteuerung (hier durch die globale Variable RemoteControl) sucht diese Funktion den korrekten Returncode für den Default Button heraus und gibt diesen ohne Rückfrage an den Bediener als Funktionsergebnis zurück. Falls der Fernsteuerungsmerker nicht gesetzt ist, arbeitet die Funktion wie üblich. Hier habe ich lediglich noch die Bequemlichkeit hinzugefügt, über die globale Variable strMsgTitle für einen einheitlichen MsgBox-Titel zu sorgen.

Wichtig ist der Aufruf Interaction.MsgBox(). Dieser sorgt dafür, dass falls notwendig die Originalfunktion aus der Bibliothek aufgerufen wird. Würden wir das Interaction. vergessen, hätten wir einen Stack Overflow, da die Funktion sich immer wieder selbst aufruft und nie zu einem Ende käme.

Ähnliche Artikel:

Schreibe einen Kommentar

Deine Email-Adresse wird nicht veröffentlicht.

sechs − eins =