Gambas France BETA


Pas de compte ? Incription

[Résolu (pour l'auteur)]Variables globales

Ce sujet est résolu.

123
AuteurMessages
Foromus#1 Posté le 23/1/2010 à 16:41:00
Bonjour,

Soit un projet qui comporte 3 feuiles (ou +).
Dans chaque feuille, j'utilise une variable précise, du nom de "MaVar", mais dans des conditions différentes (ce qui justifie 3 feuilles).
En préambule, je dirais que je n'ai pas vu d'exemple avec plusieurs feuilles dans les aides, mais il est possible que certaines m'aient échappé (même probable).
Au départ, et comme en VB, je pensais la déclarer en Public, dans un module, module pouvant comprendre aussi des procédures ou des fonctions utilisables dans toutes les feuilles. (j'ai d'ailleurs réussi à en faire une, pour fermer tout depuis n'importe quelle feuille). Mais pour la variable globale, ça n'a pas l'air de fonctionner.
Bon pour revenir à MaVar, j'ai plusieurs possibilités. La première, c'est d'en déclarer une pour chaque feuille, avec le même nom. Même déclarée en Public au début du code, elle devrait rester localisée à la feuille. Est-ce que je me trompe ?
Si MaVar est stockée dans un fichier, je peux faire une lecture de fichier dans la procédure Form_Open de chaque feuille, laquelle procédure ne sera faite qu'une fois, puisque le changement de feuille est appelé par la méthode Show, il n'y a plus d'Open une fois que la feuille a été ouverte. Donc ça, ça colle, dites-moi si je me trompe.
Maintenant, il se peut que MaVar soit utilisée la première fois à la feuille1, puis ensuite à la feuille2, puis à la feuille1 à nouveau, puis à la feuille3. Et là, je ne sais plus trop comment faire...

Un complément en passant :
Si, en début de feuille, je déclare :
Public MyVar As Integer
Private MyVar As Integer
quelle sera la différence ?
J'ai remarqué qu'une procédure relative à un contrôle (genre : Bouton_Click), devait toujours être en Public, par contre, une procédure anonyme (genre : Verification), pouvait être, elle, en Private. Est-ce inhérent à Gambas ?
manu#2 Posté le 23/1/2010 à 17:16:00
Avec Gambas ca roule !Tres simple Foromus

Dans un module (ou dans tout autre classe) tu déclares une variable en Public.
Ex : Dans Module1 :
1
PUBLIC sMaVariable AS STRING


Si tu veux lire dans cette variable et l'afficher dans une textbox de FMain, tu tapes dans FMain par ex :
1
textbox1.text =Module1.sMaVariable


Tous simplement :)



Publique -> visible dans toute l'application
Private -> visible dans toute la classe
Dim -> visible dans la fonction
Tu as des rappel sur ces notions ICI dans le Wiki


Donc pour completer :

La première, c'est d'en déclarer une pour chaque feuille, avec le même nom. Même déclarée en Public au début du code, elle devrait rester localisée à la feuille. Est-ce que je me trompe ?

Oui tu te trompes ces variables sont visible depuis d'autres classe (ou feuille comme tu dis...)

Maintenant, il se peut que MaVar soit utilisée la première fois à la feuille1, puis ensuite à la feuille2, puis à la feuille1 à nouveau, puis à la feuille3. Et là, je ne sais plus trop comment faire...

Et bien tu as plusieurs possibilité :

Sois tu déclares ta variable en publique dans un module et tu crée une fonction dans ce module qui va lire le contenu de cette variable dans ton fichier. Puis tu appel ou modifie le contenu de cette variables des autres classes. Tu lances cette fonction dans le Form_Open de ton formulaire principale.

Sois tu crée la même fonction de lecture du fichier texte pour inscrire son contenu dans une variable déclaré en private dans chaque classe...

là c'est toi qui vois ! :)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
spheris#3 Posté le 23/1/2010 à 17:40:00
en résumé :

http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=59

;)
Foromus#4 Posté le 23/1/2010 à 17:44:00
Merci Manu pur ces explications claires.

Rappel :
La pédagogie n'est certainement pas une science, mais plus probablement un art...
Et en matière d'art, on a plus ou moins de talent....

En général, quand on ne comprend pas ou mal, c'est qu'il y a u mot ou un terme qui n'est pas clair dans notre esprit, bien souvent à notre insu.

Ici, et pour ce cas concret, je prends conscience que pour moi, j'ai un travail à faire pour "intégrer" parfaitement la notion de "classe" qui, assurément, n'est pas claire dans mon esprit.
Tenez, quand je parle de "feuille", je vous vois sourire... Comment je l'appelle alors ? Pour moi, je raisonne toujours ou presque, en VB, tant que je n'aurai pas acquis un minimum de Gambas (c'est presque toujours comme ça quand on apprend une langue), et donc pour moi, quand je parle de "feuille", c'est, non seulement le "graphisme" (ce qu'on voit), mais surtout le code qui va avec. Et effectivement ici, le code s'appelle "Classe". Il va donc falloir que je relie les parentés pour m'en imprégner...
Ai-je été clair ?...

Merci pour ces renseignements, je vais faire quelques essais...
manu#5 Posté le 23/1/2010 à 20:25:00
Avec Gambas ca roule !
En général, quand on ne comprend pas ou mal, c'est qu'il y a un mot ou un terme qui n'est pas clair dans notre esprit, bien souvent à notre insu.


Mon grand père disais souvent cela :
Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément.

C'est pas toujours facile mais j'ai toujours cette phrase en tête et je me dis toujours que quand je n'arrive pas à expliqué un truc clairement, c'est que je n'ai pas tous compris... Merci à toi de me dire que c'est clair, ça veux dire pour moi que j'ai bien compris aussi !!
:lol: :lol: :lol:


Tenez, quand je parle de "feuille", je vous vois sourire... Comment je l'appelle alors ?


La partie visible, c'est le Formulaire ou le/la Form. "Physiquement", c'est un fichier texte avec une extention .form .

Le code de ce formulaire est dans un fichier text avec une extention .class. En Gambas, chaque classe est dans un fichier distinct, ce qui n'est pas le cas d'autre langage comme le C et le Java par exemple.




Dans cet exemple tu vois les fichiers créés par l'ide de gambas pour un petit projet appelé Essais. Tu peux voir les différents fichiers dont deux ouvert avec un éditeur de texte. Tu vois un fichier Module1.module dans lequel on a le contenu de Module1 et de FMain.form dans lequel on peux voir qu'il y a 2 contrôles avec leurs propriétés.

Magique.... :bball:
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Foromus#6 Posté le 23/1/2010 à 20:56:00
Donc, et si j'ai un peu compris quelque chose, pour faire simple, je peux partir de l'idée que "Classe" va (ou peut) contenir 1 formlaire (fichier que l'ide va présenter graphiquement) + le code (autre fichier que l'ide va présenter sous forme scripturale. Je suppose que "Module" est aussi une classe, mais "mono", uniquement scripturale...
Mais alors dans Gambas, pourquoi il y a, dans l'arborescence : Module,Classe, Formulaire ? Si tout est classe ?...

Par contre, pour les variables globales, j'ai du mal à digérer le truc. Bon, exemple (inventé), concret :
Module1 je déclare Public Age As integer
Formulaire1 je dis que Age = 20
Formulaire2 je dis que Age de l'année prochaine sera Age +1
Formulaire3, je dis Age = 35 (ils se sont plantés à l'état-civil..)

Bon, ça, çà ne marche pas, il faudrait au moins que je fasse Module1.Age = 20 dans Formulaire1
Et après, pour les deux autres ? Est-ce que je continue à trimballer mon "Module1.Age" ?
Ou alors, je fais, dans Module1 un Private Age As integer, et ensuite, je fais Age = Module1.Age ?
Et là encore, je me demande, où je pourrais faire l'égalité ? Certainement pas dans la Form_open, car au second rappel, ladite ne sera plus lue. Il me reste à faire l'égalité dans la procédure où j'entends l'utiliser ?
Non mais là, faut que je m'en sorte....

(Note perso : en principe, le samedi, c'est repos du cerveau....)
manu#7 Posté le 24/1/2010 à 10:06:00
Avec Gambas ca roule !Non une Form est une Form et une classe est une classe....


S'il te plais, va lire le wiki ici
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Foromus#8 Posté le 24/1/2010 à 11:23:00
Merci Manu,

J'avais déjà lu l'article relatif. Ce que je retiens de suite et qui confirme ce que j'ai déjà dit :

C'est pour cette raison, que ces notions doivent êtres parfaitement claires dans votre esprit.


Il est clair que ce n'est pas encore clair dans mon esprit.
Je vais donc m'appesantir sur la question...
gambix#9 Posté le 24/1/2010 à 12:00:00
Faire simple !Bravo manu ... :)

mieux que moi !

pour résumé un formulaire est une forme spéciale de classe qui précharge en mémoire des objets décrits dans le fichier form.

une classe est toujour éxécutée dans un ordre précis
'classes
_init
_load

'pour les formulaire
form_open
form_show
form_gotfocus
form_activate

form_lostfocus
form_hide
form_close

'classes
_free

en faite il y a une fonction cachée dans l'interpréteur qui appel une fonction j'ai nommée $Load, qui va lancer le processus de lecture et de convertion du fichier form. Donc un formulaire est juste un tour de passe passe pour éviter d'avoir a le construire dynamiquement et surtout ça laisse la possibilité d'avoir un bel editeur :). Dans visual basic le fichier .form est mixé a sa classe... en gambas les deux fichier porte le même nom seule l'extention change .


C'est quoi une classe ? ... bien ça c'est vu :)


Un module ?

Un module est un type spéciale de classe qui est définit par défaut comme static. donc qui n'est pas instanciable . .

'Module
Public MaVar1 as Integer
Public MaVar2 as String

est la même chose que :

'Classe
Static Public MaVar1 as Integer
Static Public MaVar2 as String


La encore il sagit de convention de notation, il est d'usage qu'un module soit static ... ça évite de se poser des question en permanence a ce sujet.


dans certain cas on peut utiliser des variable de type static dans une classe pour un question de logique de localisation.


Par exemple :


'Classe MonObjet
Static Public Count as Integer

Public sub Load()

INC MonObjet.Count

End

Public sub _Free()

Dec MonObjet.Count

End


'Module de démarage
Public sub Main()
Dim i As Integer
Dim hMonObjet1, hMonObjet2 as MonObjet

For i = 1 to 15

hMonObjet = New MonObjet

Next

For j=3 to 9

hMonObjet2 = New MonObjet

Next

'Alors ...Il en reste combien ?

Print MonObjet.Count

End



Tien voici l'exercice du jour !... combien va indiquer MonObjet.Count ?

(ps: y a un piege !)
Moins de texte dans une signature c'est agrandir son espace.
jeanyvon#10 Posté le 24/1/2010 à 15:05:00
Gambas? Ma! Et gusto
Bravo manu ... :)

mieux que moi ! .../...

'Module de démarage
Public sub Main()
Dim i As Integer
Dim hMonObjet1, hMonObjet2 as MonObjet

For i = 1 to 15

hMonObjet = New MonObjet

Next

For j=3 to 9

hMonObjet2 = New MonObjet

Next

'Alors ...Il en reste combien ?

Print MonObjet.Count

End
Tien voici l'exercice du jour !... combien va indiquer MonObjet.Count ?

(ps: y a un piege !)

Hello
il n'y a aucun objet tu n'as pas dimensionné "J" donc il y a une erreur..... :pirat:
JY
Vieillir? On peut retarder mais pas y échapper!
gambix#11 Posté le 24/1/2010 à 19:01:00
Faire simple !bien admetton que j'ai bien déclaré j !!! ... oui zut !

c'est pas ce que je voulais mettre en évidence !
Moins de texte dans une signature c'est agrandir son espace.
manu#12 Posté le 24/1/2010 à 20:49:00
Avec Gambas ca roule !2 ?
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
jlouis#13 Posté le 24/1/2010 à 21:32:00
8 c'était peut-être trop simple ! (Pour une tranche de REBLOCHON) :bounce:

J'essaye - 20 en tenant compte que "j" n'a pas été déclaré et...

DIM i, j AS Integer
Dim hMonObjet1, hMonObjet2 as MonObjet

For i = 1 to 15
hMonObjet1 = New MonObjet ' il manquait le "1"
Next

For j=3 to 9
hMonObjet2 = New MonObjet
Next
jeanyvon#14 Posté le 25/1/2010 à 07:31:00
Gambas? Ma! Et gustoHello!
Je me suis méfié quand tu as dit qu'il y avait un piège!
Maintenant:
J'en compte moins 20!
A+
JY
Édition2
C'est dans la classe qu'il décomptait avec DEC au lieu comme on l'a tous lu INC
Vieillir? On peut retarder mais pas y échapper!
gambix#15 Posté le 25/1/2010 à 19:21:00
Faire simple !Manu est bien un fils prodigue :) !!

bon oui 2 tout simplement parce que tout objet n'ayant plus d'index contenu dans une variable (oui la variable ne contient pas l'objet mais un index 'id', 'handle' 'adresse memoire' qui indique ou le trouver) est systématiquement libéré et donc détruit. Les deux seul survivant sont donc ceux contenus dans les variables. Néanmoin comme ce sont de variable locale ... si on quite la procedure un jour, elle disparaiteron a ce moment la et les objet avec.

C'est ce qu'on appelle le ramasse miette... c'est le système qui libère la mémoire a la demande.

parfoit il arrive que ces objet ne puisse pas être libéré x object non freed dit gambas... donc il se trouve que des variable contienne encore des objet a la cloture du programme.... pensez a libérer tout ce qui peut être dans les variable private et public de vos classes par une entrée dans l'event _free.


Public sub _Free

Mavar = Null
MaCol.Clear
etc
end
Moins de texte dans une signature c'est agrandir son espace.
123