Inhaltsverzeichnis

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;</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.

Schleifen

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.


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;




Start - FAQ - Glossar - Sitemap - Impressum