4.9.2 Kontrollstrukturen
Mehrfachauswahl CASE OF
Verschachtelte IF-THEN-ELSE-Entscheidungen kann man oftmals umgehen und so das Programm einfacher strukturieren. Wenn auf verschiedene Werte einer Variablen verschieden reagiert werden soll, kann man mit Object-Pascal bequemer als durch mehrfaches IF-Abfragen einfach die CASE-Anweisung nutzen.
Am einfachsten lässt sich diese Anweisung erklären, wenn die Variable (der Selektor) verschiedene konstante Werte einnimmt. Diese Werte müssen ordinal sein, also abzählbar, d. h. vom Typ Integer oder Char - niemals Real.
Solche einfache CASE-Anweisung sieht folgendermaßen aus:
CASE Selektor OF
Auswahlmarke1 : Anweisung1;
Auswahlmarke2 : Anweisung2;
Auswahlmarke3 : Anweisung3;
Auswahlmarke4 : Anweisung4;
...
Auswahlmarken : Anweisungn;
ELSE Anweisung;
END; //von CASE
Die CASE-Anweisung wird durch ein END; abgeschlossen, für das es kein BEGIN gab. Deshalb kann man durch einen Kommentar darauf hinweisen, dass hier das Ende der CASE-Anweisung gemeint ist. Der ELSE-Zweig ist optional, d. h. wenn er fehlt, wird mit der Anweisung fortgefahren, die der CASE-Anweisung folgt. Die Anweisungen können selbstverständlich auch Blöcke sein, die dann mit BEGIN und END eingeschlossen werden müssen.
Ganz deutlich wird die Syntax, wenn man sich folgende Zeilen ansieht, mit denen jeder Schulnote ein Worturteil zugeordnet wird.
var Note: Integer;
Wertung: String;
CASE Note OF
1 : Wertung := 'Sehr gut';
2 : Wertung := 'Gut';
3 : Wertung := 'Befriedigend';
4 : Wertung := 'Ausreichend';
5 : Wertung := 'Mangelhaft';
6 : Wertung := 'Ungenügend';
ELSE Wertung := 'Diesen Notenwert gibt es nicht.';
END; //von CASE
Der Selektor muss kein konstanter Wert sein. Es sind auch mehrere Werte möglich, die dann einzeln durch Komma getrennt aufgezählt werden oder die einen Bereich darstellen, von dem der erste und der letzte Wert - durch zwei Punkte verbunden - angegeben werden.
var Punkte: Integer;
Wertung: String;
CASE Punkte OF
0 : Wertung := 'Ungenügend';
1,2,3 : Wertung := 'Mangelhaft';
4,5,6 : Wertung := 'Ausreichend';
7..9 : Wertung := 'Befriedigend';
10..12 : Wertung := 'Gut';
13..15 : Wertung := 'Sehr gut';
ELSE Wertung := 'Diese Punktzahl gibt es nicht.';
END; //von CASE
Hier noch ein Beispiel für Char als Selektor-Typ:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Var Spruch: String;
begin
CASE Key OF
'A'..'Z' : Spruch := 'Das war ein großer Buchstabe.';
'a'..'z' : Spruch := 'Das war ein kleiner Buchstabe.';
'0'..'9' : Spruch := 'Sie haben eine Ziffer eingegeben.';
ELSE Spruch := 'Sie haben weder einen Buchstaben noch eine Ziffer eingegeben.';
END; //von CASE
Label1.Caption := Spruch;
end;
|