Step 10 - Case

Spendenaufruf des DRK Ortsvereins Spielberg e.V.

16. April 2023

 

Hallo liebe Besucherin, hallo lieber Besucher!

In einem ganz anderen Kontext möchte ich hier nun bewerben:
Der Verein, für den ich auch einstehe, benötigt Spenden:


Bitte bei der Überweisung den Verwendungszweck beachten!

Der neuste Stand gibt es hier zu sehen!

Echte Großzügigkeit gegenüber der Zukunft besteht darin, alles in der Gegenwart zu geben. (Audrey Hepburn)

 

 

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 :)
 
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ß :)