Ein Programm besteht aus verschiedenen Konstrukten, die meist Anweisungen genannt werden. Es gibt dabei unterschiedliche Formen, die sich meist durch ihre Komplexität unterscheiden.
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 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 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;</code> \\ == 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. <Code Delphi linenums> 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- 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.
Eine weitere Form bedingter Anweisungen sind 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 Endlosschleife. Sie läuft vom Start endlos
weiter. Deshalb ist es wichtig, beim Programmende eine Ausstiegsbedingung zu definieren. Außerdem sollten mit 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 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. |
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;