Switch

Vergleicht einen Wert mit mehreren Cases und führt die Anweisungen der ersten Übereinstimmung aus.

Switch SwitchWert, GroßKleinSensitiv
{
Case CaseWert1:
    Anweisungen1
Case CaseWert2a, CaseWert2b:
    Anweisungen2
Default:
    Anweisungen3
}

Parameter

SwitchWert

Wenn dieser und der GroßKleinSensitiv-Parameter weggelassen werden, wird das erste Case ausgeführt, dessen Auswertung True (weder 0 noch leer) ergibt. Andernfalls wird SwitchWert einmal ausgewertet und mit jedem Case-Wert verglichen. Bei Übereinstimmung wird das entsprechende Case ausgeführt.

Wenn kein Case übereinstimmt, wird Default ausgeführt, falls vorhanden.

GroßKleinSensitiv

Typ: Zeichenkette oder Integer (boolesch)

Wenn weggelassen, wird standardmäßig On verwendet. Andernfalls geben Sie einen der folgenden Werte an, wodurch alle Werte als Zeichenketten verglichen werden:

On oder 1 (true): Jeder Vergleich erfolgt Groß-/Kleinschreibung-sensitiv.

Off oder 0 (false): Jeder Vergleich erfolgt nicht Groß-/Kleinschreibung-sensitiv, d.h. die Großbuchstaben A bis Z und die entsprechenden Kleinbuchstaben werden als identisch betrachtet.

Locale: Jeder Vergleich erfolgt nicht Groß-/Kleinschreibung-sensitiv, gemäß den Regeln der aktuellen Sprach- und Regionseinstellungen des Benutzers. Zum Beispiel behandeln die meisten englischen und westeuropäischen Sprach- und Regionseinstellungen die Großbuchstaben A bis Z, einschließlich ASCII-fremde Großbuchstaben wie Ä und Ü, und die entsprechenden Kleinbuchstaben als identisch. Locale ist 1- bis 8-mal langsamer als Off, abhängig von den zu vergleichenden Zeichenketten.

CaseWertN

Der zu prüfende oder zu vergleichende Wert, je nachdem, ob SwitchWert vorhanden ist.

Bemerkungen

Wie bei den Operatoren = und == wird, sofern GroßKleinSensitiv weggelassen wird, ein numerischer Vergleich durchgeführt, wenn sowohl SwitchWert als auch der Case-Wert reine Zahlen sind, oder wenn einer der Werte eine reine Zahl und der andere eine numerische Zeichenkette ist. Jeder Case-Wert wird separat behandelt und beeinflusst nicht den Vergleichstyp anderer Case-Werte.

Wenn der GroßKleinSensitiv-Parameter vorhanden ist, werden alle Werte als Zeichenketten verglichen, nicht als Zahlen, und es wird ein TypeError ausgelöst, wenn die Auswertung von SwitchWert oder CaseWert ein Objekt ergibt.

Wenn der GroßKleinSensitiv-Parameter weggelassen wird, sind Zeichenkettenvergleiche standardmäßig Groß-/Kleinschreibung-sensitiv.

Für jedes Case können bis zu 20 Werte angegeben werden. Jeder Wert muss ein Ausdruck sein, aber es kann auch ein einfacher Ausdruck angegeben werden, z.B. eine direkt geschriebene Zahl, eine in Anführungszeichen gesetzte Zeichenkette oder eine Variable. Case und Default müssen mit einem Doppelpunkt enden.

Die erste Anweisung eines Case kann entweder unter oder neben dem Case stehen. Jedes Case endet indirekt beim nächsten Case/Default oder bei der geschweiften Endklammer. Im Gegensatz zu den Switch-Anweisungen in einigen anderen Sprachen gibt es kein indirektes Fall-Through, außerdem wird kein Break verwendet (außer um eine umschließende Schleife zu unterbrechen).

Da sich alle Cases im selben Block befinden, kann ein Label, das in einem Case definiert ist, das Ziel von Goto in einem anderen Case sein. Wenn allerdings ein Label direkt über Case oder Default platziert wird, verweist es auf das Ende des vorherigen Case, nicht auf den Anfang des nächsten Case.

Default muss nicht als letztes aufgelistet werden.

If, Else, Blöcke

Beispiele

Vergleicht eine Zahl mit mehreren Cases und zeigt das Mitteilungsfenster der ersten Übereinstimmung an.

switch 2
{
case 1: MsgBox "keine Übereinstimmung"
case 2: MsgBox "Übereinstimmung"
case 3: MsgBox "keine Übereinstimmung"
}

Der SwitchWert-Parameter kann weggelassen werden, um das erste Case auszuführen, dessen Auswertung True ergibt.

Zkette := "Franz jagt im komplett verwahrlosten Taxi quer durch Bayern."
switch
{
case InStr(Zkette, "Bus"): MsgBox "false"
case InStr(Zkette, "Taxi"): MsgBox "true"
case InStr(Zkette, "Bahn"): MsgBox "false"
}

Um dieses Beispiel zu testen, geben Sie < gefolgt von einer der unten aufgelisteten Abkürzungen, weitere 5 Zeichen oder Enter/Esc/Tab/. ein; oder warten Sie 4 Sekunden.

~<::
{
    ih := InputHook("V T5 L4 C", "{enter}.{esc}{tab}", "btw,otoh,fl,ahk,ca")
    ih.Start()
    ih.Wait()
    switch ih.EndReason
    {
    case "Max":
        MsgBox 'Ihre Eingabe "' ih.Input '" hat die maximale Textlänge erreicht'
    case "Timeout":
        MsgBox 'Sie haben "' ih.Input '" innerhalb der verfügbaren Zeit eingegeben'
    case "EndKey":
        MsgBox 'Sie haben "' ih.Input '" eingegeben und die Eingabe mit ' ih.EndKey ' beendet'
    default:  ; Übereinstimmung
        switch ih.Input
        {
        case "btw":   Send "{backspace 3}by the way"
        case "otoh":  Send "{backspace 4}on the other hand"
        case "fl":    Send "{backspace 2}Florida"
        case "ca":    Send "{backspace 2}California"
        case "ahk":
            Send "{backspace 3}"
            Run "https://www.autohotkey.com"
        }
    }
}