Ce sujet est résolu.
123 | |||||
Auteur | Messages | ||||
---|---|---|---|---|---|
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 :
Si tu veux lire dans cette variable et l'afficher dans une textbox de FMain, tu tapes dans FMain par ex :
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 !! 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.... 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 ... Hello il n'y a aucun objet tu n'as pas dimensionné "J" donc il y a une erreur..... 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) 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 gusto | Hello! 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 |