Wo sind die STATIC VARs

Wie ich gerade feststellen musste, reagieren Upper() und Lower() anders als erwartet (aus xBase Sicht) ... hierfür gibt es eine andere Funktion. Hier sollen solche allgemeinen Themen behandelt werden.
Antworten
satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Wo sind die STATIC VARs

Beitrag von satmax »

Wie verwende ich Statics in Windev? Muss ich die wirklich mit Globael VARs ersetzen?

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von Herbert »

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

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von satmax »

Ich brauche aber eine STATIC.

Beispiel:

Function test()
STATIC oDlg
...
IF oDlg == NIL
oDlg=new()
ELSE
oDlg:TuWas()
...
ENDIF
RETURN

Lewi
Member
Beiträge: 74
Registriert: 3. September 2010, 14:45
Wohnort: Hamburg
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von Lewi »

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

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von satmax »

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.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von Herbert »

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

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
The 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.
aus http://doc.windev.com/en-US/?1514032
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)
anstelle von

Code: Alles auswählen

PROCEDURE MeinName(stxt)

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von satmax »

Ich glaube Ihr versteht mich falsch,

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)
unter Xbase mit Static wird i bei jedem Funktionsaufruf um eines erhöht (aus dem Kopf geschrieben):

Code: Alles auswählen

FUNCTION MyTest()
Static i:=0
i +=1
debugprint("i:"+str(i))
Und genau dieses Verhalten möchte ich haben.

Herbert
Site Admin
Beiträge: 529
Registriert: 23. Februar 2010, 08:06
Wohnort: Langenthal, Schweiz
Kontaktdaten:

Re: Wo sind die STATIC VARs

Beitrag von Herbert »

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:

Code: Alles auswählen

inum is int
Mytest(inum)

Code: Alles auswählen

PROCEDURE MyTest(inum)
inum++

Antworten