|
Wie können Sie prüfen, ob einer Funktion oder Prozedur in einem
optionalen Parameter des Datentyps String überhaupt ein String
übergeben worden ist? Wäre der Parameter vom Datentyp Variant,
könnten Sie die IsMissing-Funktion
verwenden:
Sub Test(Optional ABC As Variant)
Debug.Print IsMissing(ABC)
End Sub
Die Aufrufe mit oder ohne Parameter ergeben:
Test --> Wahr
Test "" --> Falsch
Test "Hallo" --> Falsch
Dagegen versagt die IsMissing-Funktion bei allen übrigen
Datentypen. Sie können sich offensichtlich nur damit behelfen, den
Parameter-Wert auf den uninitialisierten Wert des jeweiligen
Datentyps hin zu prüfen (beim Datentyp String sollte man meinen,
das wäre die leere Zeichenfolge ""), in der Annahme dass
dieser selbst nicht als Wert auftreten wird, oder einen
gewissermaßen "unmöglichen" Wert als Voreinstellung
festzulegen und in einer Prüfung auszuschließen.
Annahme des uninitialisierten Werts:
Sub Test(Optional ABC As String)
Debug.Print ABC = ""
End Sub
Die Aufrufe mit oder ohne Parameter ergeben hier:
Test --> Wahr
Test "" --> Wahr, aber nicht beabsichtigt!
Test "Hallo" --> Falsch
Annahme eines "unmöglichen" Werts:
Sub Test(Optional ABC As String = "§$§$§$")
Debug.Print ABC = "§$§$§$"
End Sub
Die Aufrufe mit oder ohne Parameter ergeben hier:
Test --> Wahr
Test "" --> Falsch
Test "Hallo" --> Falsch
Diese beiden Möglichkeiten sind jedoch nur behelfsmäßige
Krücken, die Sie in der freien Verwendung von optionalen Parametern
mit beliebigen Werten einschränken.
Für optionale String-Parameter gibt es allerdings eine
Hintertür, durch die Sie zu einer tatsächlichen Prüfung des
uninitialisierten Werts gelangen: die undokumentierte Visual
Basic-Funktion StrPtr.
Die Funktion StrPtr liefert den Wert des Zeigers (das ist,
vereinfacht gesagt, die Speicheradresse des Strings) zu einem
String. Und bei einem uninitialisierten String ist dieser Wert
schlicht 0, da ein uninitialisierter String für VB noch nicht
existiert. Prüfen Sie also mit dieser Funktion den übergebenen
optionalen String-Parameter.
Sub Test(Optional ABC As String)
Debug.Print StrPtr(ABC) = 0
End Sub
Die Aufrufe mit oder ohne Parameter ergeben nun, ohne Krücke:
Test --> Wahr
Test "" --> Falsch
Test "Hallo" --> Falsch
Sie können zur Prüfung auch unsere folgende Funktion
IsEmptyString verwenden. Reichen Sie einen optionalen Parameter
über deren optionalen Parameter weiter, ändert sich nichts an der
"Uninitialisiertheit" des Parameters:
Public Function IsEmptyString(Optional Str As String) As Boolean
IsEmptyString = CBool(StrPtr(Str) = 0)
End Function
Nun wieder unsere Test-Prozedur:
Sub Test(Optional ABC As Variant)
Debug.Print IsEmptyString(ABC)
End Sub
Die Aufrufe mit oder ohne Parameter ergeben:
Test --> Wahr
Test "" --> Falsch
Test "Hallo" --> Falsch
Genau so, wie Visual Basic bei der InputBox sehr wohl zwischen
Abbruch und der tatsächlichen Rückgabe eine leeren Strings zu
unterscheiden weiß (siehe "Abbruch
einer InputBox"), können auch Sie die
Rückgabewerte ihrer Funktionen prüfen, wenn String der Datentyp
einer Funktion ist. Weisen Sie in der Funktion nicht ausdrücklich
einen Rückgabewert zu, ergibt die Prüfung des Rückgabewertes mit
IsEmptyString True. Sobald Sie jedoch einen Rückgabewert zuweisen,
selbst wenn Sie einen leeren String zuweisen, ergibt die Prüfung
False - es wird also tatsächlich ein String zurückgegeben:
Function Test2(Übergabe As String) As String
Select Case Übergabe
Case "Hallo"
Test2 = "OK"
Case "Nix"
Case Else
Test2 = ""
End If
End Function
Dim nStr As String
nStr = Test2(Übergabe)
If IsEmptyString(nStr) Then
Debug.Print "Keine Rückgabe"
Else
Debug.Print "/" & nStr & "/"
End If
Je nach dem, was Sie übergeben, wird ausgegeben:
Hallo --> /OK/
Welt --> //
Nix --> Keine Übergabe
|