8.6. Programmablauf

8.6.1. case of

Abbildung 8.39. Einstellungen Case
images/casedlg.png

Eine Case-Anweisung besteht aus zwei Teilen, dem Anweisungskopf mit dem Selektor (case Ausdruck of) und dem Verzweigungsteil, in dem die einzelnen Werte behandelt werden (select Wert:). In Abhängigkeit von dem Wert des Selektors springt der Interpreter zu den verschiedenen Verzweigungen. Die letzte Verzweigung kann ein else sein, sie wird immer ausgeführt wenn kein voriger Selektor passte. Die Case-Anweisung wird mit end case abgeschlossen.

Sie können eine Case Anweisung z.B. auch verwenden, um abzufragen, welche Schaltfläche der Benutzer bei Verwendung des „UserButton“-Befehls angeklickt hat.

case UserButtons of
    select "1x":
        TextOut(Text: "Eins");
    select "2x":
        TextOut(Text: "Zwei");
    ...
end case;

Anmerkung

Im Gegensatz zu anderen Sprachen, erlaubt Winguard die Eingabe von Ausdrücken in den Selektoren. Es wird jedoch immer nur der erste passende Zweig ausgeführt.

8.6.2. if then else

Abbildung 8.40. Einstellungen IF-THEN-ELSE
images/ifthenelsedlg.png

Mit diesem Befehl werden andere Befehle abhängig von einer Bedingung ausgeführt oder nicht ausgeführt. Die Befehlszeilen unter if Bedingung then werden ausgeführt, wenn die Bedingung zutrifft, andernfalls wird der Bereich unterhalb von else ausgeführt. Die Zeile else ist optional und kann gelöscht werden, wenn keine Befehle ausgeführt werden sollen, wenn die Bedingung nicht zutrifft. end if beendet die Verzweigung.

Eine Bedingung ist erfüllt, wenn sie einen wahrer logischer Ausdruck, ein nicht-leerer String oder eine Zahl ungleich 0 ist.

if True then            // immer erfüllt.
if "" then              // nie erfüllt.
if messwert > 10 then   // Wenn der in 'Messwert' gespeicherte Wert größer als
                        // 10 ist, ist die Bedingung erfüllt
if b = 1 then           // Die Bedingung ist erfüllt, wenn 'b' den Wert 1 hat
if b - 1 then           // Die Bedingung ist erfüllt, wenn 'b' einen Wert
                        // ungleich 1 hat

Steht zwischen if … then und end if die Anweisung else, so werden alle Zeilen über else ausgeführt, falls die Bedingung erfüllt ist, alle darunterstehenden falls die Bedingung nicht erfüllt ist.

if messwert > 10 then
    TextOut(Text: "Messwert ist größer als 10!");
else
    TextOut(Text: "Messwert ist zu klein!");
end if

8.6.3. Schleifen

Es werden drei verschiedene Arten von Schleifen unterstützt: For-Schleife, While-Do-Schleife und Repeat-Until-Schleife.

For-Schleife

Eine For-Schleife wird verwendet um den Wert einer Zahlenvariablen hochzuzählen. Die Variable muss zuvor deklariert worden sein. Eine For-Schleife hat die Form for Variable := Startwert to Abbruchwert do, der auszuführende Block wird mit end for abgeschlossen.

Bei Ausführung wird der Variablen der Startwert zugewiesen. Dieser wird solange um eins erhöht, bis der Abbruchwert erreicht ist. Vor jeder Erhöhung wird der Schleifenrumpf oder Block ausgeführt. Der Wert der Schleifenvariable ist nach dem Durchlauf gleich Startwert + 1.

for i := 1 to 10 do
    TextOut(Text: i);
end for

Das Beispiel gibt zeilenweise die Zahlen 1 bis 10 aus. Der Wert von i ist nach dem Durchlauf 11.

While-Do-Schleife

Bei While-Do-Schleifen wird der Schleifenrumpf solange ausgeführt, solange eine gegebene Bedingung wahr (Nichtnull) ist. Sie wird in Winguard durch folgendes Konstrukt eingeleitet while Bedingung do und beendet mit end while.

while a < b do
    a := a + 1
    b := b / 2
end while;          // erhöhe a um 1, teile b durch 2 bis a >= b ist

while True do
end while;          // diese Schleife wird nicht verlassen (Programm hängt!)

while False do
end while;          // diese Schleife wird nicht durchlaufen

Repeat-Until-Schleife

Repeat-Until-Schleifen werden mindestens einmal durchlaufen. Die Abbruchbedingung steht am Ende der Schleife, die Schleife wird solange ausgeführt, solange diese Bedingung nach falsch auswertet. Der Schleifenkopf besteht aus einem einfachen repeat, das Schleifenende enthält die Abbruchbedingung: until Bedingung;.

repeat
    a := a + 1
    b := b / 2
until a >= b;       // diese Schleife ist nicht identisch mit der obigen
                    // while-Schleife!

8.6.4. goto

Abbildung 8.41. Einstellungen Goto
images/gotodlg.png

Dieses Modul erzeugt bedingte oder unbedingte Programmsprünge. Im oberen Feld wird das Label eingegeben, zu dem gesprungen werden soll. Ist die Checkbox Bedingung angeklickt, wird der Sprung nur ausgeführt, wenn die eingegebene Bedingung zutrifft.

In den meisten Fällen sind die anderen Kontrollstrukturen besser lesbar.

8.6.5. Label

Abbildung 8.42. Einstellungen Label
images/labeldlg.png

Label sind so genannte Sprungmarken. Damit der Interpreter von einer Skriptzeile zu einer anderen springen kann, muss diese durch ein Label benannt werden (vgl. goto).

8.6.6. HALT

Mit diesem Befehl wird die Ausführung des Prüfprogrammes beendet und der Testlauf ordnungsgemäß abgeschlossen. Die Zeilen in der Unit FINALIZATION werden allerdings noch ausgeführt, um Hardware ggf. zurückzusetzen.