10.6 Verzweigung des Programmflusses

Zur Steuerung des Programmablaufes in einer Regel stehen verschiedene Konstrukte zur Verfügung:

10.6.1 if-then-else

Mit einer if-Anweisung kann ein Programmzweig mit Anweisungen definiert werden, der nur durchlaufen wird, wenn eine Bedingung erfüllt ist. Optional kann ein weiterer Programmzweig mit Anweisungen definiert werden, der ausgeführt wird, wenn die Bedingung nicht erfüllt ist.

Syntax

if <boolescher Ausdruck>
then
  <Anweisungen>
{ else
    <Anweisungen> }
endif

Ist <boolescher Ausdruck> wahr (true), so werden die <Anweisungen> zwischen then und else ausgeführt;

Ist <boolescher Ausdruck> falsch (false), so werden die <Anweisungen> zwischen else und endif ausgeführt.

In diesem Statement kann der else-Teil entfallen.

Beispiel

on PbBlink select
{
  if (WnMain.visible)
  then
    WnMain.visible := false;
  else
    WnMain.visible := true;
  endif
}

Bei Bestätigen des Knopfes PbBlink wird zunächst geprüft, ob das Fenster WnMain sichtbar ist (Wert von WnMain.visible).

Wenn das Fenster sichtbar ist (WnMain.visible = true), so wird es durch das Statement WnMain.visible := false unsichtbar gemacht.

Ist das Fenster nicht sichtbar (WnMain.visible = false), so wird es durch das Statement WnMain.visible := true sichtbar gemacht.

10.6.2 if-elseif-else

Das if-elseif-else-Konstrukt ist eine verkürzte Schreibweise für verschachtelte if-then-else-if.

Syntax

if <boolescher Ausdruck>
then
  <Anweisungen>
[ elseif <boolescher Ausdruck>
  then
    <Anweisungen> ]
{ else
    <Anweisungen> }
endif

In diesem Statement können die elseif-Teile beliebig oft wiederholt werden.

Beispiel

on PbBlink select
{
  if (WnMain.childcount = 0)
  then
    print "Habe keine Objekte.";
  elseif (WnMain.childcount = 1)
  then
    print "Habe ein Objekt.";
  else
    print "Habe mehrere Objekte.";
  endif
}

10.6.3 case-Anweisung

Eine case-Anweisung kann anstatt mehreren if-then-endif-Konstrukten verwendet werden. Soll sich daher ein Programm an einer Stelle in mehrere Äste verzweigen, eignet sich hierfür eine case-Anweisung.

Syntax

case <Ausdruck>
[ in <Kriterium> [ , <Kriterium> ] :
    <Anweisungen> ]
{ otherwise :
    <Anweisungen> }
endcase
Kriterium ::= <Wert> | <Min> .. <Max>

Beispiel

case Edittext.content
  in "Hello":
    print "Yes";
  in "Bye":
    exit();
  otherwise:
endcase

Eine case-Anweisung prüft für jeden in-Ausdruck, ob dieser wahr ist.

Beispiel

variable integer V := 10;
case V
  in 10:
    print "10";
  in 1..100:
    print "1..100";
  in 10..19:
    print "10..19";
  in 20..29:
    print "20..29";
  otherwise:
    print "nothing";
endcase

Ausgabe

"10"
"1..100"
"10..19"

Hier werden alle Statements aufgeführt, die den Wert erfüllen.

Wurde keiner der in-Ausdrücke erfüllt, dann – und nur dann – wird otherwise ausgeführt, soweit es angegeben worden ist.

Sobald ein oder mehrere in-Ausdrücke erfüllt wurden, wird otherwise nicht mehr ausgeführt.

Im Gegensatz zu C und anderen Programmiersprachen dürfen in in-Ausdrücken auch variable Werte vorkommen.

Beispiel

on PushbuttonOK select
{
  case true
    in Checkbox_1.active:
      // Aktion für die erste Checkbox, wenn aktiv
    in Checkbox_2.active:
      // Aktion für die zweite Checkbox, wenn aktiv
    in Checkbox_3.active:
      // Aktion für die dritte Checkbox, wenn aktiv

    // otherwise ist hier nicht notwendig
  endcase
}

Da in den in-Ausdrücken auch Berechnungen zugelassen sind, kann das obige Beispiel auch für den Fall erweitert werden, dass für inaktive Checkboxen (not) eine bestimmte Aktion ausgeführt wird.

on PushbuttonOK select
{
  case true
    in Checkbox_1.active:
      // Aktion für die erste Checkbox, wenn sie aktiv ist
    in Checkbox_2.active:
      // Aktion für die zweite Checkbox, wenn sie aktiv ist
    in Checkbox_3.active:
      // Aktion für die dritte Checkbox, wenn sie aktiv ist
    in not Checkbox_1.active:
      // Aktion für die erste Checkbox, wenn sie nicht aktiv ist
    in not Checkbox_2.active:
      // Aktion für die zweite Checkbox, wenn sie nicht aktiv ist
    in not Checkbox_3.active:
      // Aktion für die dritte Checkbox, wenn sie nicht aktiv ist

    // otherwise ist hier immer noch nicht notwendig
  endcase
}

Anmerkung

Es sind auch beliebige Variablen zugelassen. Bitte beachten Sie dabei, dass der richtige Typ verwendet wird.