Programmstruktur

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen

Programmstruktur eines Xbase Programms

Generell gibt es keine zwingende Struktur, wie sie z.B. von COBOL her bekannt ist. Es gibt jedoch bestimmte Abhängigkeiten, die beachtet werden sollten.

Ein Programm sollte etwa diese Struktur haben:

#DEFINE CRLF Chr(13)+Chr(10)
#INCLUDE "AppEvent.ch"
#INCLUDE "Xbp.ch"
#PRAGMA Library("SQLXpp.LIB")
STATIC lRunning
FUNCTION Main(p1, p2)
   LOCAL nEvent, mp1, mp2, oXbp
   GenerateDialog()
   nEvent := xbe_None
   WHILE nEvent <> xbeP_Close
      nEvent := AppEvent(@mp1, @mp2, @oXbp)
      oXbp:handleEvent(nEvent, mp1, mp2)
   END
RETURN(.T.)
INIT PROCEDURE RUNME
   lRunning := .T.
RETURN
EXIT PROCEDURE RUNMETOO
   lRunning := .F.
RETURN

Das Layout lässt sich so zusammenfassen:

Gewisse Änderungen der Reihenfolge sind möglich, aber auch nur beschränkt. So kann eine programmquellen-weit sichtbare STATIC nur vor der ersten ausführbaren Anweisung deklariert werden. Die Reihenfolge von DEFINE, INCLUDE und PRAGMA ist beliebig und vom eigenen Stil (oder den Vorgaben des Auftraggebers) abhängig.

Die Reihenfolge, in der Main, INIT und EXIT PROCEDURE sowie weitere Funktionen definiert werden, ist dem Programmierer überlassen.


#DEFINE

Mit der Anweisung #DEFINE werden figurative Konstanten definiert, die zur vereinfachten Darstellung verwendet werden.

Ein klassisches Beispiel steht oben, zwei weitere Varianten:

#DEFINE TRUE   .T.
#DEFINE FALSE  .F.

Für #DEFINE und #INCLUDE gilt, dass die dort definierten figurativen Konstanten erst ab der Position verwendet werden können, an der sie definiert wurden:

FUNCTION MAIN()
   Local cVar
   cVar := CRLF
   #DEFINE CRLF  Chr(13)+Chr(10)

Dieser Programmcode wird bei der Zuweisung von CRLF an cVar scheitern, weil der Compiler CRLF erst ab der Deklaration in sein Verzeichnis aufnimmt und verwendet.


#INCLUDE

Mit der Anweisung #INCLUDE werden sogenannte Header-Dateien eingebunden, die ihrerseits aus normalem Programmcode bestehen können (Vorsicht, wenn ausführbarer Code verwendet wird und STATICs definiert werden sollen, die in der ganzen Programmquelle sichtbar sein sollen.


#PRAGMA

Mit der Anweisung #PRAGMA wird der Linker angewiesen, eine bestimmte Bibliothek einzubinden, die z.B. bestimmte Funktionen zur Verfügung stellt, die nicht in der Standard-Runtime enthalten sind. Auch Dritt-Anbieter Bibliotheken können auf diese Art und Weise eingebunden werden.


programmquellen-weit sichtbare STATIC

Funktionen

besondere Prozeduren

INIT PROCEDURE

INIT PROCEDUREs werden bei Programmstart aufgerufen, wobei jedoch die Reihenfolge nicht definiert ist. Sie dienen dazu, bestimmte Initialisierungen durchzuführen und werden nach

aufgerufen. Nach Abarbeitung aller INIT PROCEDUREs wird Main() ausgeführt.

Eine INIT PROCEDURE erhält beim Aufruf die an das Programm übergebenen Parameter, kann aber keine Werte zurückliefern (daher als PROCEDURE definiert).

Ein Aufruf der INIT PROCEDUREs nach dem Start von Main() ist nicht möglich, da INIT PROCEDUREs nicht im normalen Symbolverzeichnis abgelegt werden.


EXIT PROCEDURE

Wenn Main() mittels RETURN verlassen wird, oder das Programm mit QUIT beendet wird, werden die definierten EXIT PROCEDUREs ausgeführt. Auch hier gilt - analog zu den INIT PROCEDUREs, dass eine Reihenfolge nicht festgelegt ist.

Im Fall eines Laufzeitfehlers oder bei Drücken von Alt-C wird das Programm beendet, ohne dass die EXIT PROCEDUREs aufgerufen werden.

Eine EXIT PROCEDURE kann keine Parameter entgegennehmen.


(Arikelinarbeit)