===== 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]]