Die Syntax für diese Kontrollstruktur mag Sie zuerst mit ihrer Vielfalt überraschen – sie ist aber im praktischen Einsatz schnell umzusetzen:
SELECT [ CASE ] Expression [ CASE [ Expression ] [ TO Expression #2 ] [ , ... ] ... ] [ CASE [ Expression ] [ TO Expression #2 ] [ , ... ] ... ] [ CASE LIKE Expression [ , ... ] ... ] [ { CASE ELSE | DEFAULT } ... ] END SELECT
Die Beispiele zeigen vorwiegend Quelltext-Ausschnitte und werden kurz kommentiert.
Beispiel 1
Die Auswahl wird für verschiedene (Zahlen-)Bereiche mit unterschiedlichen Selektoren vorgenommen:
Public Sub GetInformation(iNumber As Integer) Select Case iNumber Case 0 Print "Auswahl = 0" Case 1 To 2 Print "Auswahl 1 oder 2" Case 3 To 5, 7 To 9 Print "Auswahl zwischen 2-5 oder 7-9" Case 6 Print "Auswahl = 6" Case Else Print "Auswahl nicht im Bereich von 0-9" End Select End ' GetInformation(iNumber As Integer) ' Public Sub GetInformation(iNumber As Integer) ' Select CStr(iNumber) ' Case "0" ' Print "Auswahl 0" ' Case Like "[1-2]" ' Print "Auswahl 1 oder 2" ' Case Like "[3-57-9]" ' Case Like "[345789]" ' Print "Auswahl zwischen 3-5 oder 7-9" ' Case "6" ' Print "Auswahl 6" ' Case Else ' Print "Auswahl nicht im Bereich von 0-9" ' End Select' ' End ' GetInformation(iNumber As Integer)
Als Selektoren werden ein Zahlenwert (0 und 6), ein Zahlenbereich 1-2 oder eine Liste von zwei Zahlenbereichen 3-5 und 7-9 eingesetzt. Der auskommentierte Quelltext setzt für die Selektoren den Like-Operator ein.
Mit diesem Quelltext werden nach einem Klick auf den entsprechenden Button
Public Sub btnSelectedRange_Click() GetInformation(0) GetInformation(2) GetInformation(8) GetInformation(6) GetInformation(13) End ' btnSelectedRange_Click()
folgende Zeilen in der Konsole der IDE ausgegeben:
Auswahl = 0 Auswahl 1 oder 2 Auswahl zwischen 2-5 oder 7-9 Auswahl = 6 Auswahl nicht im Bereich von 0-9
Beispiel 2
Zuerst wird eine If..Then..Else_If_End_If-Kontrollstruktur für drei alternative Fälle angegeben:
For iNumber = 0 To xmlNode.Children.Count – 1 sBuffer = xmlNode.Children[iNumber].Name If sBuffer = "title" Then sTitle = xmlNode.Children[iNumber].Value Else If sBuffer = "link" Then sItemLink = xmlNode.Children[iNumber].Value Else If sBuffer = "description" Then sDescription = xmlNode.Children[iNumber].Value Endif Next
und dann die Umsetzung in eine adäquate Select..Case..End_Select-Kontrollstruktur:
For iNumber = 0 To xmlNode.Children.Count - 1 sBuffer = xmlNode.Children[iNumber].Name Select Case sBuffer Case "title" sTitle = xmlNode.Children[iNumber].Value Case "link" sItemLink = xmlNode.Children[iNumber].Value Case "description" sDescription = xmlNode.Children[iNumber].Value End Select Next
Beispiel 3
PUBLIC SUB Form_KeyPress() IF Key.Control SELECT CASE Workspace1.Children.Find(Workspace1.ActiveWindow) CASE 0 TO Workspace1.Children.Count - 2 Workspace1.ActiveWindow = Workspace1.Children[Workspace1.Children.Find(Workspace1.ActiveWindow) + 1] CASE Workspace1.Children.Count - 1 Workspace1.ActiveWindow = Workspace1.Children[0] CASE ELSE ' Alternative ... END SELECT ENDIF END ' Form_KeyPress()
Das erste Case prüft eine Liste von Werten. Eine alternative Auswahl existiert bei 'CASE ELSE' nicht – ist aber vorgesehen!
Beispiel 3
Public Sub GetStatus(sStatus As String) Select sStatus Case Like "[+Pp]*" Message.Info(IIf(sStatus Begins "+", "Status: positiv", "Status: " & sStatus)) Case Like "[-Nn]*" If sStatus Begins "-" Then sStatus = "negativ" Message.Info("Status: " & sStatus) Default Message.Error("Der Status konnte NICHT ermittelt werden!") End Select End ' GetStatus(sStatus As String)
Der Aufruf von GetStatus(„Status ok“) in der folgenden Prozedur
Public Sub btnSelect_Click() GetStatus("Status ok") End ' btnSelect_Click()
erzeugt diese Fehler-Meldung in einem separaten Fenster: