Gambas France BETA


Pas de compte ? Incription

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

Ce sujet est résolu.

123
AuteurMessages
jlouis#16 Posté le 25/1/2010 à 19:41:00
Ben mince alors... :)

On peut voir le code ?

J'ai créé une classe nommée MonObjet...
1
STATIC PUBLIC Count AS IntegerPUBLIC SUB Load()INC MonObjet.CountENDPUBLIC SUB _Free()DEC MonObjet.CountEND


Puis dans FMain j'ai mis...
1
PUBLIC SUB Form_Open()DIM i, j AS IntegerDIM hMonObjet1, hMonObjet2 AS MonObjetFOR i = 1 TO 15 hMonObjet1 = NEW MonObjetNEXTFOR j = 3 TO 9 hMonObjet2 = NEW MonObjetNEXTPRINT MonObjet.CountEND


J'ai du foirer quelque part car le résultat est -20.

Pour obtenir un résultat de 2 je dois remplacer "PUBLIC SUB Load()" par "PUBLIC SUB _new()" sinon MonObjet n'est jamais incrémenté.

1
STATIC PUBLIC Count AS IntegerPUBLIC SUB _new()INC MonObjet.CountENDPUBLIC SUB _Free()DEC MonObjet.CountEND
jeanyvon#17 Posté le 25/1/2010 à 21:56:00
Gambas? Ma! Et gustobonsoir Gambix!
Faut que tu explique plus!



Merci d'avance! :lol!:
Vieillir? On peut retarder mais pas y échapper!
jlouis#18 Posté le 25/1/2010 à 22:58:00
Voici mon explication jeanyvon,

Gambix nous propose ce code-ci :
Dim hMonObjet1, hMonObjet2 as MonObjet

et toi
Dim hMonObjet, hMonObjet2 as MonObjet

Il vaut mieux que Gambix nous montre le code que nous aurions dû tous utiliser pour arriver à 2.

Effectivement jeanyvon nous avons adapté le code un peu différemment et nous sommes arrivé au même résultat. Dès lors nous nous posons la même question. ;)
manu#19 Posté le 26/1/2010 à 08:34:00
Avec Gambas ca roule !Ok je vais tenter de répondre. :geek:

Personnellement, je n'ai pas écris le code dans l'IDE pour répondre à la devinette de Gambix, j'ai juste essayer de comprendre ce qu'il expliquais et tenté une réponse. C'est sans doute pour ça que j'ai eu juste....

Il y à cependant, semble il, une petite erreur dans ce que nous à expliqué Gambix car l'evenement _Load semble réservée à l'interpretation des formulaires (.Form). En revanche,cet evenement semble se comporter comme _New à savoir qu'il est déclanché qu'une seule fois pour les autres classes (.class et .module) au chargement de celle-ci.

Dans votre code, vous avez mis l'incrementation de vos objets dans la sub _Load. Comme cette sub n'est exécutée que pour les formulaires, et que vous êtes dans une classe .Class, les objets ne sont jamais incrémentés...

Tapez dans votre ide public sub _ et vous ne verrez pas d'événement _Load mais tout un tas d'événements dont un _New .

Bon voilà, mais je ne suis pas le spécialiste... Gambix nous dira ca peut être... :)
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#20 Posté le 26/1/2010 à 11:51:00
Bonjour tout le monde,

@ Manu,

Tout d'abord, je tiens à préciser que j'ai bien consulté le lien :
http://wiki-gambas.eg2.fr/doku.php?id=gambas#programmation_orientee_objet
et aussi :
http://gambaslinux.eg2.fr/articles.php?lng=fr&pg=59
Et même plusieurs fois !
Je ne pourrai donc pas être taxé de mauvaise foi, ou "refus d'obtempérer aux ordres"
Ce qui ne m'empêchera probablement pas d'être fusillé !

Moi, j'aime bien les objets, par exemple, à l'atelier, j'ai un objet "Scie", je peux considérer que je l'ai déclaré dans ma liste d'outillage le jour où je l'ai ajouté (physiquement), aux autres outils. Mais à vrai dire, je m'en fous un peu de l'objet en tant qu'objet, ce qui m'intéresse davantage, c'est l'événement "Scier une planche" qui présente le plus d'intérêt, événement que j'interprète avec la méthode "Sciage".
Autrement, j'ai passé en revue tous les exemples, je les ai chargés, fait tourner, examiné le code (calculette, cuisson d'œuf, pointeur de souris, etc.).

Bien, je note que je peux déclarer dans un module :
Public MaVariable as String
Ensuite, si je veux l'utiliser dans ma Form1 et la txtbox qui y est :
textbox1.text = Module1.MaVariable
Je vais donc "faire avec"...

Pour l'instant, je monte une application pour gérer la fortune de mon neveu, Toto, il travaille, il est ramasseur de mégots. J'ai donc déclaré en Module1 :
Public Fortune As Integer
Dans mon second formulaire, Form2, j'ajoute le montant des ventes de chaque journée :
Public Recette As Integer
Module1.Fortune = Module1.Fortune + Recette
Dans le formulaire 3, Form3, je retire les dépenses de fonctionnement :
Public Depenses As Integer
Module1.Fortune = Module1.Fortune - Depenses
Dans le Form4, mon neveu (un peu taré) joue au Loto, PMU et autres arnaques, donc :
Public Gains As Integer
Public Mises As Integer
Module1.Fortune = Module1.Fortune + Gains - Mises
Puis, comme Toto est quand même un peu benêt, je lui fais un récapitulatif en Form5 :
Module1.Fortune = Module1.Fortune + Recette - Depenses + Gains - Mises
Enfin, non, je ne lai pas fait, car là, ça va forcément coincer, les 4 dernières variables ne seront plus reconnues.

Bon, la principale conclusion que je peux déjà en tirer, c'est que j'ai bien fait de m'acheter un grand écran...
jeanyvon#21 Posté le 26/1/2010 à 12:38:00
Gambas? Ma! Et gusto
Ok je vais tenter de répondre. :geek:
Personnellement, je n'ai pas écris le code dans l'IDE pour répondre à la devinette de Gambix, j'ai juste essayer de comprendre ce qu'il expliquais et tenté une réponse. C'est sans doute pour ça que j'ai eu juste....
Il y à cependant, semble il, une petite erreur dans ce que nous à expliqué Gambix car l'evenement _Load semble réservée à l'interpretation des formulaires (.Form). En revanche,cet evenement semble se comporter comme _New à savoir qu'il est déclanché qu'une seule fois pour les autres classes (.class et .module) au chargement de celle-ci.
Dans votre code, vous avez mis l'incrementation de vos objets dans la sub _Load. Comme cette sub n'est exécutée que pour les formulaires, et que vous êtes dans une classe .Class, les objets ne sont jamais incrémentés...
Tapez dans votre ide public sub _ et vous ne verrez pas d'événement _Load mais tout un tas d'événements dont un _New .
Bon voilà, mais je ne suis pas le spécialiste... Gambix nous dira ca peut être... :)

Salut
merci de nous expliquer comment tu as fait mais nous n'avons rien inventé pas de sub form_load mais une sub form_open.
Je vais plus loin le seul truc que nous avons fait c'est de débugger le code de Gambix. Et honnêtement, je ne vois pas comment toi, tu as fais!
A+
JY
Vieillir? On peut retarder mais pas y échapper!
jlouis#22 Posté le 26/1/2010 à 13:05:00
D'accord avec jeanyvon, l'objectif était peut-être d'adapter la question pour arriver à la réponse voulue !!!

Allez Gambix ne nous fait pas attendre plus longtemps... :bounce:
manu#23 Posté le 26/1/2010 à 16:26:00
Avec Gambas ca roule !on va dire que j'ai eu de la chance... je devrais jouer au loto....

Jlouis


J'ai créé une classe nommée MonObjet...
1
STATIC PUBLIC Count AS IntegerPUBLIC SUB Load()INC MonObjet.CountENDPUBLIC SUB _Free()D



Tu créé une sub que tu appel load() mais jamais tu n'excutes après cette sub. Je n'avais pas vu cela ... Comment pourrais t'il y avoir une incrementation si la sub qui est sencé le faire n'est jamais appelé. Ca aurais du être _Load qui est un événement (car précédé d'un tiré bas) mais qui dans notre cas n'est pas adapté a une classe .class.


Jean yvon, tu nous montres bien un résultat mais pas tout ton code.... Certe, le code de gambix n'est pas bon non plus, c'est du pseudo code comme il dit, mais ce qui est interessant la dedans c'est le raisonement sur les objets, en tous cas c'est ce qui m'interesse...:)
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)
jeanyvon#24 Posté le 26/1/2010 à 16:50:00
Gambas? Ma! Et gusto
Jean yvon, tu nous montres bien un résultat mais pas tout ton code.... Certe, le code de gambix n'est pas bon non plus, c'est du pseudo code comme il dit, mais ce qui est interessant la dedans c'est le raisonement sur les objets, en tous cas c'est ce qui m'interesse...:)

salut Manu!
J'ai viré la partie de JLouis c'est pas bien mais ça facilitera la compréhension.
Est-ce que nous pôôvres ignares pouvons aussi être initié aux mystères que vous semblez être en mesure de percer Gambix et toi parce que quand Gambix donne un code c'est dur de faire la différence entre le pseudo et le vrais : Comment fais tu?
D'autre part tu dis à JLouis qu'il nomme une sub_load. C'est pas nous, c'est gambix qui fait ça nous n'avons fait que faire du copier-coller. Comment fais tu pour savoir ce qui n'est pas bon dans le code de gambix. Y a-t-il un forum parallèle en MP :scratch: :scratch:
Je comprend pourquoi il dit de lui qu'il n'est pas un finisseur.
Est ce que tu peux donner le code qui donne deux ou tu nous dis que tu as donné ce résultat comme ça au pif..... :lol!:
Merci jlouis quand on est 2 on est plus fort... On y arrivera.... On saura nous aussi traduire le gambix en vrai code..... :lol!:
A+
JY
Vieillir? On peut retarder mais pas y échapper!
jlouis#25 Posté le 26/1/2010 à 17:42:00
Ci-dessus j'ai écris
Pour obtenir un résultat de 2 je dois remplacer "PUBLIC SUB Load()" par "PUBLIC SUB _new()" sinon MonObjet n'est jamais incrémenté.


_Load ou Load donne un résultat de -20...

C'est très mystérieux ;) , mais très intéressant aussi.
manu#26 Posté le 26/1/2010 à 18:28:00
Avec Gambas ca roule !pas de Forum parallèle JY avec Gambix même si il m'arrive de discuter avec lui sur jabber.... Pas de pif non plus....

Perso, et je te l'ai déja dit, je ne suis pas adepte du copier coller, j'ai besoins de comprendre ce que j'écris.

Une fois, lors d'une discution avec gambix je lui ai fait part de mes difficultés avec les columnview. Il m'a envoyer un exemple (qu'il a donné ensuite sur ce forum) avec l'utilisation de l'événement _data. Sur le moment, j'ai riens pipé et finalement en réfléchissant, j'ai imbriqué des boucles et ça marche très bien aussi. Depuis, il a reposter l'exemple donc, et là, je l'ai compris, je pourrais donc l'utiliser...

Tous ça pour dire que le copier coller c'est pas pour moi. Ca permet certe d'avancer, mais pas en comprenant... mais chacun sa méthode.... :)

jlouis, je ne sais que rajouter :

Tu as créé une sub que tu n'appelles pas ensuite (Public Sub load()....)

resultat : ca n'incremente pas

Ensuite tu fait appel à un événement qui n'existe que pour les .form alors que tu es dans un .Class :

resultat : ca n'incremente pas

En revanche si tu incrémente ton objet en utilisant l'appel à l'événement _New alors ca fonctionne....Car cet événement ce comporte comme _load pour les .form.

mais on va laisser Gambix nous sortir de là.... :)
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)
manu#27 Posté le 26/1/2010 à 18:35:00
Avec Gambas ca roule !

Pour l'instant, je monte une application pour gérer la fortune de mon neveu, Toto, il travaille, il est ramasseur de mégots. J'ai donc déclaré en Module1 :
Public Fortune As Integer
Dans mon second formulaire, Form2, j'ajoute le montant des ventes de chaque journée :
Public Recette As Integer
Module1.Fortune = Module1.Fortune + Recette
Dans le formulaire 3, Form3, je retire les dépenses de fonctionnement :
Public Depenses As Integer
Module1.Fortune = Module1.Fortune - Depenses
Dans le Form4, mon neveu (un peu taré) joue au Loto, PMU et autres arnaques, donc :
Public Gains As Integer
Public Mises As Integer
Module1.Fortune = Module1.Fortune + Gains - Mises
Puis, comme Toto est quand même un peu benêt, je lui fais un récapitulatif en Form5 :
Module1.Fortune = Module1.Fortune + Recette - Depenses + Gains - Mises
Enfin, non, je ne lai pas fait, car là, ça va forcément coincer, les 4 dernières variables ne seront plus reconnues.

Bon, la principale conclusion que je peux déjà en tirer, c'est que j'ai bien fait de m'acheter un grand écran...


Oui biensur Foromus ... Recette Depenses ne serons pas reconnus mais si tu fais :

1
Module1.Fortune = Module1.Fortune + form2.Recette- form3.Depenses.....


ca, ca marchera :)
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)
gambix#28 Posté le 26/1/2010 à 18:50:00
Faire simple !Bien je me suis planté !


et bel et bien en plus ... le mot clef Load est réservé au formulaire ...

Donc les events des classes sont dans l'ordre : _init,_New,_Free

donc 'MaClass
' Gambas class file
STATIC PUBLIC Count AS Integer

PUBLIC SUB _New()

INC Count

END


PUBLIC SUB _Free()

DEC Count

END

et mon module 'MMain
' Gambas module file

PUBLIC SUB Main()

DIM hObj1, hObj2 AS Object
DIM i, j AS Integer
FOR i = 1 TO 10
hObj1 = NEW MaClasse
NEXT

FOR j = 3 TO 7
hObj2 = NEW MaClasse
NEXT

PRINT MaClasse.Count

END


Je n'avait pas gambas sous la main ... j'était sous windows... mais la c'est certifié testé !

pour comprendre le fonctionnement testez cela en pas a pas !

et voyer quand la class est intanciée (new) et libérée (free)
Moins de texte dans une signature c'est agrandir son espace.
jlouis#29 Posté le 26/1/2010 à 18:59:00
Bien le bonsoir Gambix, c'est toi qui a gagné la tranche de REBLOCHON... pour avoir reconnu ton erreur, mais qui ne se trompe jamais ?

Je crois que cela nous a permis de bien comprendre le processus de libération de mémoire, le ramasse-miettes (attention aux doigts).

Merci beaucoup et très bonne soirée.
Foromus#30 Posté le 26/1/2010 à 20:13:00
Merci Manu, avec ça, je suis paré...

Et très heureux de vous avoir donné l'occasion d'une discussion fort constructive !
123