STATIC Variable
Definition einer STATIC Variablen
STATIC Variable gehören zu den lexikalischen Variablen, die durch den Compiler aufgrund einer expliziten Definition (STATIC Statement)deklariert werden.
FUNCTION TueIrgendEtwas(cParam1, nParam2) STATIC nI, nLen
nI und nLen sind explizit über die Anweisung STATIC deklarierte Variablen.
Zur Reihenfolge der Deklaration siehe ausführbare und nicht ausführbare Deklarationen.
Besonderheiten der STATIC Variablen
Programm-Datei-weit sichtbare STATIC Variable
Wird eine STATIC Variable vor allen in einer Programm-Datei (.prg-Datei) definierten Funktionen, Prozeduren oder Klassen definiert, so kann diese Variable in der gesamten Programm-Quelle angesprochen werden:
#INCLULDE "AppEvent.ch" #DEFINE CRLF Chr(13)+Chr(10) #PRAGMA Library("OT4XB.LIB") STATIC nFritz FUNCTION Test1() ... RETURN(.T.) STATIC cDatum
nFritz kann in dieser Programm-Datei angesprochen werden, egal, in welcher Funktion, Methode, Klasse.
Die Deklaration von cDatum hingegen ist nicht zulässig, da sie sich ausserhalb einer Funktion befindet, aber nicht VOR allen definitierten Funktionen.
STATIC Variablen innerhalb einer Funktion
In einer Funktion deklarierte STATIC Variablen sind nur in dieser Funktion sichtbar und behalten ihren Wert auch dann bei, wenn die Funktion endet. Beim nächsten Aufruf der Funktion wird die Variable wieder sichtbar und hat ihren vorherigen Wert behalten.
FUNCTION TueIrgendEtwas(cP1, nP2) STATIC lRunOnce := .T. IF lRunOnce ... (Initialisierungsanweisungen) lRunOnce := .F. ENDIF ... RETURN(.T.)
In diesem Fall wird lRunOnce mit .T. initialisiert. Aufgrund dessen wird beim ersten Aufruf die IF/ENDIF Anweisung verarbeitet, an deren Ende lRunOnce auf .F. gesetzt wird. Bei jedem folgenden Aufruf der Funktion wird die Initialisierung nicht mehr durchlaufen, da lRunOnce auf .F. steht.
Wäre lRunOnce eine LOCAL Variable, würde sie bei jedem Aufruf der Funktion neu mit .T. initialisiert.
Initialisierung einer STATIC Variablen
STATIC Variablen werden beim Programm-Start initialisiert. Das bedeutet, dass man ihnen einen Initialisierungswert zuweisen kann, dieser Wert kann jedoch nur ein Literal sein und nicht der Rückgabewert einer Funktion:
STATIC dHeute := Date() // unzulässig STATIC lRunOnce := .F. // zulässig
Sichtbarkeit von STATIC Variablen
Genaueres findet sich hier: Lebenszeit und Sichtbarkeit der Variablen-Klassen