Wo sind die STATIC VARs
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Wo sind die STATIC VARs
Wie verwende ich Statics in Windev? Muss ich die wirklich mit Globael VARs ersetzen?
-
- Site Admin
- Beiträge: 535
- Registriert: 23. Februar 2010, 08:06
- Wohnort: Langenthal, Schweiz
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Eine Variable ist ab em Punkt sichtbar wo du diese definierst... es braucht weder die Definition global noch static.
Globale Variablen gemäss der Xbase-Idee werden entweder im Code des Projekts beschrieben (warum dann auch immer), oder zuoberst in einem Prozedursatz (bleiben dann innerhalb dieser Funktionen) oder eben zuoberst in einem Fenster oder Control eingetragen.
Falls du den automatischen Prefix der Variablenbenennungen aktiv hast (Optionen im Projektbeschrieb), entsteht automatisch der Buchstabe "g" vor der Variable. Der Entsteheungsort der Variable entscheidet also. Du kannst übrigens mitten im Code eine Variable definieren...
Globale Variablen gemäss der Xbase-Idee werden entweder im Code des Projekts beschrieben (warum dann auch immer), oder zuoberst in einem Prozedursatz (bleiben dann innerhalb dieser Funktionen) oder eben zuoberst in einem Fenster oder Control eingetragen.
Falls du den automatischen Prefix der Variablenbenennungen aktiv hast (Optionen im Projektbeschrieb), entsteht automatisch der Buchstabe "g" vor der Variable. Der Entsteheungsort der Variable entscheidet also. Du kannst übrigens mitten im Code eine Variable definieren...
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Ich brauche aber eine STATIC.
Beispiel:
Function test()
STATIC oDlg
...
IF oDlg == NIL
oDlg=new()
ELSE
oDlg:TuWas()
...
ENDIF
RETURN
Beispiel:
Function test()
STATIC oDlg
...
IF oDlg == NIL
oDlg=new()
ELSE
oDlg:TuWas()
...
ENDIF
RETURN
Re: Wo sind die STATIC VARs
Hi Setmax,
in Deinem Beispiel wird die Static Variable innerhalb einer Funktion definiert und hat daher in xBase++ die gleiche Sichtbartkeitkeit wie eine LOCAL Variable.
Insofern hat die Variable oDlg bei Funktionsaufruf immer den Wert "NIL".
In xBase kann der Variablentyp "STATIC" am Anfang eine Programmcode-Datei definiert werden. Dann ist die Variable in allen Funktionen und Proceduren innerhalb der Programmcode-Datei sichtbar. In WD gibt es eine entsprechendes Equivalent. Im Declaration-Abschnitt einer Procedurendatei ( die wiederum mehrere Funktionen enthalten kann) können Variablen definiert werden, die dann in allen Funktionen dieser Procedurendatei sichtbar sind.
Gruß, Olaf
in Deinem Beispiel wird die Static Variable innerhalb einer Funktion definiert und hat daher in xBase++ die gleiche Sichtbartkeitkeit wie eine LOCAL Variable.
Insofern hat die Variable oDlg bei Funktionsaufruf immer den Wert "NIL".
In xBase kann der Variablentyp "STATIC" am Anfang eine Programmcode-Datei definiert werden. Dann ist die Variable in allen Funktionen und Proceduren innerhalb der Programmcode-Datei sichtbar. In WD gibt es eine entsprechendes Equivalent. Im Declaration-Abschnitt einer Procedurendatei ( die wiederum mehrere Funktionen enthalten kann) können Variablen definiert werden, die dann in allen Funktionen dieser Procedurendatei sichtbar sind.
Gruß, Olaf
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Mir geht es nicht (nur) um die Sichtbarkeit, mir geht es um den Initialisierungswert. Eine Static hat beim ersten Aufruf den Wert NUL, Weise ich der Var einen Wert zu, bleibt dieser während der gesamten Programmlaufzeit erhalten und kann natürlich auch innerhalb der Funktion jederzeit geändert werden.
-
- Site Admin
- Beiträge: 535
- Registriert: 23. Februar 2010, 08:06
- Wohnort: Langenthal, Schweiz
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Ich denke, du hängst in der Xbase-Thematik betreffend der Variablentypen und Vorgabewerte.
In WD besteht eine sehr weitgehende Typisierung. Eine Variable erhält immer bei Definition einen Typ. (Es gibt den Typ variant für verschiedene einfache Typenzuweisungen später). Defaultwerte sind daher gegeben. Eine Integer ist 0, nicht NULL. eine Stringvariable ist "", nicht NULL usw.
In deinem Fall wäre die Variable eine Control-Variable. Solange du im selben Fenster bleibst, ist eine lokale Definition bestens. Sonst vorgehen wie Lewi schreibt!
zu deiner Frage:
Variablentypen: http://doc.windev.com/en-US/?1514064
die komplexeren Typen: http://doc.windev.com/en-US/?1514041
siehe auch http://doc.windev.com/en-US/?1514054
WD unterscheidet übrigens nicht zwischen Funktionen und Prozeduren. Alles sind Prozeduren. Du kannst Parameter übergeben oder auch einen Returnwert definieren. Variablen als Uebergabe können in der Prozedur verändert werden und sind entsprechend im aufrufenden Code nach deren Ablauf geändert. Ausser du definierst die Parameter in der Prozedur explizit lokal.
anstelle von
In WD besteht eine sehr weitgehende Typisierung. Eine Variable erhält immer bei Definition einen Typ. (Es gibt den Typ variant für verschiedene einfache Typenzuweisungen später). Defaultwerte sind daher gegeben. Eine Integer ist 0, nicht NULL. eine Stringvariable ist "", nicht NULL usw.
In deinem Fall wäre die Variable eine Control-Variable. Solange du im selben Fenster bleibst, ist eine lokale Definition bestens. Sonst vorgehen wie Lewi schreibt!
zu deiner Frage:
Variablentypen: http://doc.windev.com/en-US/?1514064
die komplexeren Typen: http://doc.windev.com/en-US/?1514041
Code: Alles auswählen
PROCEDURE test()
oDlg is Control=NULL
...
if oDlg=null then
oDlg <- ControlCreate("BUTTON_1", typButton, 30, 40, 140, 20)
oDlg ..Caption = "Click me"
oDlg ..Process[trtClick] = myProcedure
else
executeProcess(oDlg,trtclick)
end
aus http://doc.windev.com/en-US/?1514032The rule for variable scope is as follows:
If a variable "global" to the project and a variable "global" to a window have the same name:
the variable "global" to the window will be used in all the processes of the window and window controls as well as in the "local" procedures of the window.
the variable "global" to the project will be used in all the other processes.
If a variable "global" to the project and a variable "local" to a process have the same name:
the "local" variable will only be used in the process where this variable was declared.
the variable "global" to the project will be used in all the other processes.
If a variable "global" to a window and a variable "local" to a process of this window have the same name:
the "local" variable will only be used in the process where this variable was declared.
the variable "global" to the window will be used in all the other processes of the window and window controls (including the "local" procedures of the window).
none of these two variables can be used in the rest of the project.
siehe auch http://doc.windev.com/en-US/?1514054
WD unterscheidet übrigens nicht zwischen Funktionen und Prozeduren. Alles sind Prozeduren. Du kannst Parameter übergeben oder auch einen Returnwert definieren. Variablen als Uebergabe können in der Prozedur verändert werden und sind entsprechend im aufrufenden Code nach deren Ablauf geändert. Ausser du definierst die Parameter in der Prozedur explizit lokal.
Code: Alles auswählen
PROCEDURE MeinName(LOCAL stxt)
Code: Alles auswählen
PROCEDURE MeinName(stxt)
-
- Senior Member
- Beiträge: 312
- Registriert: 24. September 2015, 10:05
- Wohnort: Biberbach, Austria
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Ich glaube Ihr versteht mich falsch,
Unter Windev ergibt der folgende Code immer 1, auch wenn die Funktion mehrfach aufgerufen wird:
unter Xbase mit Static wird i bei jedem Funktionsaufruf um eines erhöht (aus dem Kopf geschrieben):
Und genau dieses Verhalten möchte ich haben.
Unter Windev ergibt der folgende Code immer 1, auch wenn die Funktion mehrfach aufgerufen wird:
Code: Alles auswählen
PROCEDURE MyTest()
i is int
i +=1
Trace("i:"+i)
Code: Alles auswählen
FUNCTION MyTest()
Static i:=0
i +=1
debugprint("i:"+str(i))
-
- Site Admin
- Beiträge: 535
- Registriert: 23. Februar 2010, 08:06
- Wohnort: Langenthal, Schweiz
- Kontaktdaten:
Re: Wo sind die STATIC VARs
Eben, das ist Xbase und codemässig gesehen nicht gut.
Du definierst auf einer tiefen Stufe eine Variable, die plötzlich weiter oben sichtbar sein soll...
(übrigens sind i,k,l,j,n,m usw. eigentlich Hilfszähler und sollten NIE übergeordnet weiterverwendet werden, nehme aber an, dass du dies nur als Beispiel hier so gewählt hast)
korrekt:
Du definierst auf einer tiefen Stufe eine Variable, die plötzlich weiter oben sichtbar sein soll...
(übrigens sind i,k,l,j,n,m usw. eigentlich Hilfszähler und sollten NIE übergeordnet weiterverwendet werden, nehme aber an, dass du dies nur als Beispiel hier so gewählt hast)
korrekt:
Code: Alles auswählen
inum is int
Mytest(inum)
Code: Alles auswählen
PROCEDURE MyTest(inum)
inum++