Programmstruktur
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:
- #DEFINEs
- #INCLUDEs
- #PRAGMAs
- Programmquellen-weit sichtbare STATICs
- Programm-Code
- INIT PROCEDURE
- EXIT PROCEDURE
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)