Programmsteuerung 2: Bedingungsabfrage mit "case"
Die Case-Anweisung funktioniert im Prinzip gleich wie eine if-Anweisung, nur mit dem Unterschied, dass
bestimmte "Fälle" abgearbeitet werden.
Es können allerdings nur Integer-werte, Buchstaben (Char) sowie Sets
abgefragt werden
Der grundsätzliche Aufbau soll kurz durch folgendes Beispiel gezeigt werden:
var i:Integer; begin //... case i of 1: //wenn i=1, dann ... begin //mach was end; 2,3,4: //wenn i=2 oder i=3 oder i=4, dann ... begin //mach was end; 5..10: //wenn i zwischen 5 und 10 begin // oder gleich 5 oder gleich 10 ist, dann... //mach was end; else // ansonsten begin // mach was anderes end; end; // Sehr wichtig: Das End von Case! end; |
Die case-Anweisung kann nur auf "abzählbare Mengen" angewandt werden.
Das heißt, wir können nicht nur Integer nehmen, aber z.B.
keinen String, da dieser nicht abzählbar ist.
Das folgende Beispiel zeigt, wie wir schon jetzt - ohne weiteres Wissen, wie ein "Datum" verarbeitet wird,
mit einem Datum als Integer arbeiten, in dem wir nur die einzelnen Elemente, Tag, Monat und Jahr, dafür
verwenden.
var tag, monat, jahr, datum : Integer; datumAlsString, msg : String; begin tag := StrToInt( edTag.Text); monat := StrToInt( edMonat.Text); jahr := StrToInt( edJahr.Text); datum := tag * 1000000 + monat * 10000 + jahr; datumAlsString := IntToStr( tag) + '.' + IntToStr( monat) + '.' + IntToStr( jahr); case datum of 31122021, 31122022, 31122023 : begin msg := 'Heute ist Silvester!'; msg := msg + ' Frohes Neues Jahr 2022!'; end; 1012022, 1012023, 1012024 : begin msg := 'Heute ist Neujahr!'; msg := msg + ' Frohes Neues Jahr 2022!'; end; else begin msg := 'Heute ist der '; msg := msg + datumAlsString; msg := '! Mach was draus ;)'; end; end; ShowMessage( msg); end; |
Kleine Quizfrage:
Was können wir in oberem Beispiel ändern, um den Code für Silvester und Neujahr für alle zukünftigen Jahre funktionsfähig zu halten? Versuche es selbst zu ändern, sobald dir etwas einfällt :)
Was können wir in oberem Beispiel ändern, um den Code für Silvester und Neujahr für alle zukünftigen Jahre funktionsfähig zu halten? Versuche es selbst zu ändern, sobald dir etwas einfällt :)
Im folgenden Beispiel wird zudem noch die "Kurzform" gezeigt. Wie bei der if-Anweisung kann hier auch
das begin und end weggelassen werden, wenn man nur eine einzige Methode hat.
type TImportantColors = (Red, Green, Blue); var cl : TImportantColors; begin // ... cl := Blue; // ... // Auch Kurzschreibform ist möglich: case cl of Red : showMessage('Red'); Green : showMessage('Green'); Blue : showMessage('Blue'); else showMessage('???'); end; // ... // Oder mehrere Werte auflisten und auf eine Anweisung legen: case cl of Red, Green : showMessage('Not Blue'); Blue : showMessage('Blue'); else showMessage('???'); end; // ... end; |
Auch wenn es recht wenig Beispiele sind - du findest diese alle unter
GitHub im Beispielprojekt ;)
Viel Spaß :)
Viel Spaß :)