PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Variables STATIC comment faire ?
Variables STATIC comment faire ?
Débuté par Patrice Terrier, 19 mai 2009 11:03 - 12 réponses
Posté le 19 mai 2009 - 11:03
J'aimerai pouvoir utiliser des variables STATIC dans une procédure,
afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales.

Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone mémoire ?

...
Posté le 19 mai 2009 - 11:43
Salut,

Passer par une classe utilitaire ?
en déclarant des membres globaux ?


@+
Maax°(51)°
Posté le 19 mai 2009 - 12:44
Hello,

regardes du côté du Passage de paramètres par valeur dans l'aide.

Comme cela t'a variable ne sera pas modifiée à chaque appel.

exemple:

toto est un entier
toto=10

P_2((toto))
P_1((toto))

Info(toto) // la valeur sera toujours 10


Bon dév.

Samuel



Patrice Terrier a écrit dans le message de news <a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> :
J'aimerai pouvoir utiliser des variables STATIC dans une procédure,
afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par des variables gobales.

Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone mémoire ?

...
Posté le 19 mai 2009 - 13:00
Bonjour,
Le fait de passer une variable par valeur et non par adresse garantie que
celle-ci ne sera pas modifiée par la procédure, ce qui n'a rien à voir avec
une variable statique.
Une variable statique "survie" entre chaque appel d'une procédure, mais elle
n'est pas accessible à l'extérieur de la procédure, et cette dernière peut
en changer la valeur.

Frédéric.
"samuel" <samuel.lorentz@o-i.ch> a écrit dans le message de
news:922bbdf72c45de06f255cd9ef44995c3@news.pcsoft...

Hello,

regardes du côté du Passage de paramètres par valeur dans l'aide.

Comme cela t'a variable ne sera pas modifiée à chaque appel.

exemple:

toto est un entier
toto

P_2((toto))
P_1((toto))

Info(toto) // la valeur sera toujours 10


Bon dév.

Samuel



Patrice Terrier a écrit dans le message de news

<a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> :
J'aimerai pouvoir utiliser des variables STATIC dans une procédure,
afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par

des variables gobales.

Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone

mémoire ?

...

Posté le 19 mai 2009 - 13:24
Jusque là les réponses proposées ne correspondent pas à ma demande.

Pour info une variable STATIC à l'intérieur d'une procédure ou d'une fonction conserve les valeurs qui lui sont affectées tout au long du fonctionnement du programme, exemple :

FUNCTION IterationCompteur ()
MyVariableStatic est un entier += 1
RETURN MyVariableStatic
Posté le 19 mai 2009 - 13:25
Frédéric,

Oui, c'est exactement la définition d'une variable STATIC, et c'est très utile en programmation !

Actuellement j'utilise une listbox cachée avec un pointeur 32-bit associé, pour sauver/retrouve mes variables statiques, mais c'est du bricolage.
Posté le 19 mai 2009 - 13:42
Dommage dans la declaration des collections de procédures globales "PRIVE" n'a aucun effet...

Créer une classe utilitaire en effet, avec une méthode à la place de ta procédure qui utilise des membres PRIVE ( pas besoin de GLOBAL si elle n'est instanciée qu'une seule fois dans le code du projet ), mais ils seront visibles également par les autres méthodes si il y en a....

C'est plus "propre" qu'une zone mémoire à mon sens...
Posté le 19 mai 2009 - 13:44
Hello, tu as entièrement raison. Mais cela ne résout par le problème des STATIC et WINDEV.

Mea-culpa, le sens de ma réponse était :
Il est mieux d'utiliser le passage de variable par par adresse ou valeur au lieu de déclarer des globales. En effet, le problème vient que toutes les procédures de la collection peuvent utiliser ces variables.

En espérant qu'il y a aura bientôt ce type à disposition dans les futurs versions.

Bon dév à tous ;-)






Frédéric DEMILLY a écrit dans le message de news <4a1273a1@news.pcsoft.fr> :
Bonjour,
Le fait de passer une variable par valeur et non par adresse garantie que
celle-ci ne sera pas modifiée par la procédure, ce qui n'a rien à voir avec
une variable statique.
Une variable statique "survie" entre chaque appel d'une procédure, mais elle
n'est pas accessible à l'extérieur de la procédure, et cette dernière peut
en changer la valeur.

Frédéric.
"samuel" <samuel.lorentz@o-i.ch> a écrit dans le message de
news:922bbdf72c45de06f255cd9ef44995c3@news.pcsoft...

Hello,

regardes du côté du Passage de paramètres par valeur dans l'aide.

Comme cela t'a variable ne sera pas modifiée à chaque appel.

exemple:

toto est un entier
toto

P_2((toto))
P_1((toto))

Info(toto) // la valeur sera toujours 10


Bon dév.

Samuel



Patrice Terrier a écrit dans le message de news
<a9c7c087adb560bbcebb5d79b3b244cc@news.pcsoft> :

J'aimerai pouvoir utiliser des variables STATIC dans une procédure,
afin qu'elles gardent leur valeur d'un appel à l'autre sans passer par
des variables gobales.


Y-a-t'il un moyen simple, ou suis-je obliger de passer par une zone
mémoire ?


...



Posté le 19 mai 2009 - 14:13
Il n'y a pas d'équivalent en windev aux variables static d'une fonction
en C.

A toi de trouver une alternative ;)

eric l.

> Patrice Terrier a écrit :
Jusque là les réponses proposées ne correspondent pas à ma demande.

Pour info une variable STATIC à l'intérieur d'une procédure ou d'une fonction conserve les valeurs qui lui sont affectées tout au long du fonctionnement du programme, exemple :

FUNCTION IterationCompteur ()
MyVariableStatic est un entier += 1
RETURN MyVariableStatic
Posté le 19 mai 2009 - 20:04
Il y a une solution que j'utilise, et qui est toute simple, j'utilise de champs de saisie invisibles en cochant memoriser la valeur.
Ensuite il suffit de les affecter une premiere fois sans meme les declarer puisque ce sont des champs.

numerique
SI champ1 = 0
CHAMP1 = valeur
FIN
caracteres
SI taille(sansespace(champ2)) = 0
CHAMP2 = "VALEUR"
FIN
etc..
Posté le 19 mai 2009 - 20:05
Une petite precision...
Si la variable doit faire partie d'une procedure ou fonction, met tes champs dans la premiere fenetre du projet.
Posté le 19 mai 2009 - 20:38
Avec cette méthode, la valeur est mémorisée entre deux lancements de
L'APPLICATION, et sa portée est globale.
Avec une variable statique, une valeur est mémorisée entre chaque appel
d'une PROCEDURE, et sa portée est limitée à la procédure en question.
Donc ce n'est pas la même chose.

La seule solution "de fortune" est d'utiliser une classe avec des membres
privés, et des méthodes qui remplacent les procédures nécessitant des
variables statiques.

Frédéric.
"HADDAD" <mirohaddad@gmail.com> a écrit dans le message de
news:13f5e6d5b9c8ff6043cf1c3edaa9f7d0@news.pcsoft...

Il y a une solution que j'utilise, et qui est toute simple, j'utilise de

champs de saisie invisibles en cochant memoriser la valeur.
> Ensuite il suffit de les affecter une premiere fois sans meme les declarer
puisque ce sont des champs.

numerique
SI champ1 = 0
CHAMP1 = valeur
FIN
caracteres
SI taille(sansespace(champ2)) = 0
CHAMP2 = "VALEUR"
FIN
etc..
Posté le 22 mai 2009 - 09:46
Bon,

Puisqu'il n'existe pas de solution pour gérer les variables STATIC en WLangage, j'ai bricolé une solution basée sur l'utilisation de l'API bas niveau qui permet d'associer un entier (32-bit) à une LISTBOX virtuelle.

Note : on peut quand même utiliser des valeurs décimales à condition de multiplier par 100 au moment de l'affectation, puis par 0.01 lorsqu'on relit la valeur à convertir à nouveau en décimal.

Il est également possible de stocker directement un réel sur 4-octets à condition d'utiliser la fonction TRANSFER(t) qui permet de copier d'une adresse mémoire à une autre.

Le code est composé d'une procédure (pour sauver la variable STATIC) et d'une fonction pour la récupérer.
Procedure SetStaticValue(LOCAL sUseString is string, LOCAL nValue is int)
sUseString += "|"
nhMain is int = Handle(MyWindow..Name)
nStaticHandle is int = GetDlgItem(nhMain, ID_STATIC)
IF nStaticHandle = 0 THEN
nStaticHandle = API("USER32", "CreateWindowExA", 0, "LISTBOX", "", WS_CHILD | LBS_HASSTRINGS, 0, 0, 0, 0, nhMain, ID_STATIC, Instance, 0)
END
IF nStaticHandle THEN
nIndex is int = SendMessage(nStaticHandle, 399, -1, &sUseString)
IF nIndex > -1 THEN // We found same static
SendMessage(nStaticHandle, 410, nIndex, nValue)
ELSE // Add it to our static list
SendMessage(nStaticHandle, 410, SendMessage(nStaticHandle, 384, 0, &sUseString), nValue)
END
END


FUNCTION GetStaticValue(LOCAL sUseString is string)
sUseString += "|"
nValue is int = 0
nhMain is int = Handle(MyWindow..Name)
nStaticHandle is int = GetDlgItem(nhMain, ID_STATIC)
IF nStaticHandle THEN
nIndex is int = SendMessage(nStaticHandle, 399, -1, &sUseString)
IF nIndex > -1 THEN // We found it
nValue = SendMessage(nStaticHandle, 409, nIndex, 0)
END
END
RESULT nValue


Utilisation pour sauver une variable STATIC
------------------------------------------
nStaticValue is int = 99
SetStaticValue("nStaticValue", nStaticValue)

Utilisation pour retrouver une variable STATIC
---------------------------------------------
nStaticValue is int = GetStaticValue("nStaticValue")

Note : au besoin on peut convetir la chaine en majuscule si on veut pas tenir compte de la casse des lettres.

...

Patrice Terrier
www.zapsolution.com