===== Anweisungen =====
\\
==== Einleitung ====
Ein Programm besteht aus verschiedenen Konstrukten, die meist Anweisungen genannt werden. Es gibt dabei unterschiedliche Formen, die sich meist durch ihre Komplexität unterscheiden.
=== Einfache Anweisungen / Zuweisungen ===
So ist z.B. die Zuweisung eines Wertes zu einer Variablen eine einfache Anweisung.
// Deklaration
var
// Name : Typ
slot : Integer;
begin
..
// Zuweisung
slot := Cockpit.Slot;
..
end.
Den oberen Teil, in dem der Typ der Variablen als Integerwert festgelegt wird, nennt man hingegen ''Deklaration''. Dort wird die Variable ''slot'' deklariert, die einen Wert vom Typ ''Integer'' enthält. Der Typ ''Integer'' kann folgende Werte annehmen:
^min | -2.147.483.648 |
^max | 2.147.483.648 |
Anweisungen lassen sich kombinieren und man erhält dann strukturierte Anweisungen. \\
=== Strukturierte Anweisungen ===
Strukturierte Anweisungen setzen sich aus anderen Anweisungen zusammen. Sie kommen zum Einsatz, wenn andere Anweisungen sequenziell, wiederholt oder in Abhängigkeit von einer Bedingung ausgeführt werden sollen.
^ Verbundanweisung (**with**-Anweisung) | Führt eine Folge von Teilanweisungen aus. Beispiele für ''With-Anweisungen'' finden sich meist im Code, der mit Datenbankabfragen oder Formularen arbeitet. |
^ Bedingte Anweisung (**if**- oder **case**-Anweisung) | Prüft auf eine Bedingung und führt nach der Auswertung mindestens eine ihrer Teilanweisungen aus. ''Fallunterscheiudung'' ist ein weiterer gebräuchlicher Begriff. |
^ Schleifenanweisungen (**repeat**-, **while**- und **for-Schleifen**) | Eine Folge von Teilanweisungen wird mehrmals hintereinander ausgeführt. |
^ Spezielle Anweisungsgruppen (**try...except** und **try...finally**) | Dienen zur Generierung und Behandlung von Ausnahmen im Programmablauf. Sie werden meist bei Dateioperationen verwendet. |
\\
== Verbundanweisungen ==
Verbundanweisungen sind zwischen die Begriffe ''begin'' und ''end;'' eingeschlossen.
// Beispiel 1 Verbundanweisung
begin
a := 1;
b := 2;
c := a + b;
end;
Hier noch ein Beispiel einer Verbundanweisung in Form der ''with-Anweisung''.
// Abfrage der gewählten Session für Ermittlung des Datums
with NewQUERYStat do
begin
sql.Clear;
sql.Text := 'SELECT ID, Datum, Uhrzeit FROM EinzelRundenDef WHERE ID=:einzelRundenDefId';
ParamByName('einzelRundenDefId').AsInteger := cpGetIntegerVar('einzelRundenDefID');
Open;
First;
cpSetStringVar('DatumGewaehlt', FieldByName('Datum').AsString);
Free;
end;
\\
== Bedingte Anweisungen ==
Die am häufigsten verwendete bedingte Anweisung stellt ''if ... then ... else'' dar. Hier wird eine Bedingung auf ihren Wahrheitsgehalt geprüft und entsprechend Anweisungen ausgeführt.
begin
// Prüfen, welcher Rennbahntyp eingestellt ist
// und entsprechende Meldung ausgeben
if cpCourseAnalogTyp then
begin
cpShowMessage('Analoge Rennbahn gewählt.');
end
else
begin
cpShowMessage('Digitale Rennbahn gewählt.');
end;
...
// Ist der auslösende Slot der dritte in der Liste
// aktuelle Position anzeigen
if Cockpit.Slot = 3 then
begin
cpShowMessage('Aktuelle Position: ' + IntToStr(Cockpit.Position));
end;
end.
Es ist mit ''if ... then ... else'' ebenfalls möglich, Fallunterscheidungen zu programmieren. Einfacher, schneller und besser lesbar ist hingegen der Einsatz der **case**-Anweisung.
begin
// Fallunterscheidung abhängig vom Slot
case Cockpit.Slot of
1 : cpShowMessage('Name: ' + Cockpit.FahrerName);
2..4 : cpShowMessage('Platz: ' + IntToStr(Cockpit.Position));
3,5 : cpShowMessage('Regler-ID: ' + IntToStr(Cockpit.SlotID));
else
cpShowMessage('Fahrzeug: ' + Cockpit.FahrzeugName);
end;
end.
Das Beispiel zeigt für den ersten Slot den Fahrernamen, bei Slot 2, 3 und 4 die aktuelle Position, für Listeneinträge 3 und 5 die Regler-ID (digital) oder Spurnummer (analog), sowie für alle anderen (möglich 6-8) den Namen des Fahrzeugs.
Diesen kompakten Codeblock mit ''if ... then ... else if ... then ... else'' abzubilden ist deutlich umfangreichern und schlechter nachvollziehbar. Ich verzichte hier auf das Beispiel dazu. \\
\\
== Schleifen ==
Eine weitere Form bedingter Anweisungen sind [[cockpit-xp:addon:schleifen:schleifen|Schleifen]]. Hier wird der Code innerhalb der Schleife mehrfach wiederholt, bis die Bedingung eintritt, die zu ihrem Ende führt. Aufgrund des Umfangs dieses Themas, gibt es im Wiki den vorgenannten eigenen Unterpunkt.
Eine besondere Form der Schleife ist die [[cockpit-xp:addon:schleifen:endlosschleife|Endlosschleife]]. Sie läuft vom Start ''endlos'' weiter. Deshalb ist es wichtig, beim Programmende eine Ausstiegsbedingung zu definieren. Außerdem sollten mit [[cockpit-xp:addon:befehlsreferenz:cpsleep|cpSleep]] geplante Pausen eingelegt werden. Ohne diese Unterbrechnungen kann es sein, dass die Rechnerresourcen vollständig belegt werden und das System hängt oder abstürzt.
Das einzige Ereignis, in dem ein Cockpit-AddOn eine Endlosschleife ermöglicht ist [[cockpit-xp:addon:ereignisse:startrealtime|StartRealTime]]. Dieses tritt ein, sobald nach dem Klick auf den Start-Button der Rennbildschirm gestartet ist.
Unterschied zwischen **while**- und **repeat**-Schleifen:
^ while ''bedingung'' do \\ Anweisungen | Bei der While-Schleife wird zuerst die Bedigung geprüft. Erst im Anschluss durchläuft der Code die folgenden Anweisungen. Das geschieht so lange, wie die Bedigung ''NICHT'' zutrifft. Trifft die Bedingung sofort zu, wird der Code ''NICHT'' ausgeführt. |
^ repeat ''anweisung(en)'' \\ until ''bedingung'' | Hier wird der Anweisungsblock der Schleife mindestens einmal durchlaufen, bevor die Bedingung geprüft wird. |
\\
== Spezielle Anweisungen ==
Beispiel für eine Spezielle Anweisung, die prüft, ob eine Datei exisitiert. Trifft das zu, ist das Ergebnis ''True'', anderenfalls ''False''.
// Funktion die prüft, ob eine Datei existiert oder nicht
// Übergabeparameter ist der Dateiname
function FileExists( sDateiName : String ) : Boolean;
var
fs : TFileStream;
begin
try
fs := TFileStream.Create(sDateiName, fmOpenWrite or fmShareDenyNone);
fs.free; // Objekt wieder freigeben
result := True; // Ergebnis wahr (Datei existiert)
except
result := False; // Ergebnis falsch (Datei existiert nicht)
exit; // Funktion verlassen
end;
end;
\\
\\
----
[[cockpit-xp:start|Start]] - [[cockpit-xp:faq|FAQ]] - [[cockpit-xp:glossar|Glossar]] - [[cockpit-xp:sitemap|Sitemap]] - [[cockpit-xp:impressum|Impressum]]