IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Manipuler une feuille via un module


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut [VB.NET] Manipuler une feuille via un module
    Bonjour, j'ai une nouvelle fois un soucis avec vb.net que voici :

    la feuille de démarrage de mon projet est mafeuille1.
    Si je veux manipuler tous les contrôles de mafeuille1 il me suffit de faire (si je veux masquer un contrôle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.moncontrole.visible = false
    En revanche si je veux faire la même chose à partir d'une procèdure se trouvant dans module1 comment je dois faire ?

    Je ne peux pas faire "me" puisque je ne suis plus dans mafeuille1

    il faudrait que je récupère la variable ayant instancié mafeuille1 mais je ne sais pas comment.

    Merci

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Ton problème vient du fait que t'as pas assimilé l'aspect objet du vb.net, je m'explique:

    Quand tu fesais une form dans vb6 c'etait clair net et precis, tu créais la form tu l'utilisait, point.
    En VB.Net c'est different: toutes les classes que tu fais sont comme des "moules", pour démouler des instances d'objets. D'ou le fait que tu dois faire un New pour créer une instance de ta Form1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim maForm as New Form1
    et c'est bien "maForm" (l'instance) que tu utilise et non pas "Form1" (la classe)

    La difference entre une classe et une instance, c'est une chose qui faut bien avoir à l'esprit. Donc pour que deux objets communiquent il faut que deux instances soient au meme endroit au meme moment

    C'est comme ca pour tout sauf (et oui) pour les modules:
    Il existe un mot clef particulier pour les membres (proprietes, methodes...) des classes: Shared. Il permet de dire qu'un membre va etre commun à toutes les instances de la classe et ne necessite pas que la classe ou il se trouve soit instanciée avec un New pour pouvoir l'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Class Form1
     
    Shared UneVariable as string
     
    Dim UneAutreVariable as string
     
    End Class
    si tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim Instance1 as new Form1
    Dim Instance2 as new Form1
     
    Instance1.UneVariable = "a"
    Instance1.UneAutreVariable  = "b"
     
    Instance2.UneVariable = "c"
    Instance2.UneAutreVariable  = "d"
    Tu vas avoir au final:
    Instance1.UneVariable: "c"
    Instance1.UneAutreVariable = "b"
    Instance2.UneVariable = "c"
    Instance2.UneAutreVariable = "d"

    car UneAutreVariable est commune. Un "Module" c'est une classe dont tous les membres sont automatiquement "Shared" sans que tu aies a le spécifier. Donc voilà à mon avis la situation peut ne pas etre claire

    Pour en revenir a nos moutons car je m'éloigne un peu voila quelques solutions possibles:

    1) passe ton instance de form à la fonction qui se trouve dans le module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (dans le module)
    Sub ModifierCouleur(maForm as Form)
        maMaform.BackColor = System.Drawing.Color.Black
    End Sub
    cad que t'apelles la fonction en passant la form depuis la form: ModifierCouleur(me)

    2) a peu pres pareil mais si tu dois modifier une propriete que tu as ajouté à ta classe Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (dans le module)
    Sub ModifierControle(maForm as Form1)
        maMaform.Button1.Visible = True
    End Sub
    la difference avec le code precedent c'est que tu precise Form1

    3) Sans utiliser de module mais une classe à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Class Modificateur
        Sub ModifierControle(maForm as Form1)
            maMaform.Button1.Visible = True
        End Sub
    End Class
     
     
    Class Form1
     
        Sub test
            dim Modif as new Modificateur
            Modif.ModifierControle(me)
        End Sub
     
    End Class
    Bref il existe des tas de possibilités reste à trouver la meilleure; hum je sais pas si j'ai été clair en fait hesite pas à consulter les tutos de migration de vb6 à VB.Net

  3. #3
    Membre actif
    Avatar de toubib
    Homme Profil pro
    Médecin, developpeur
    Inscrit en
    Août 2004
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Médecin, developpeur
    Secteur : Santé

    Informations forums :
    Inscription : Août 2004
    Messages : 104
    Points : 298
    Points
    298
    Par défaut form
    Problème passionnant.
    Comme le dit notre ami, il faut se souvenir que VB fait de la programmation 'OBJET'

    Il faut instancer l'objet, une 'form' par exemple, mais ne pas oublier que pour travailler sur cet objet, il doit être 'VISIBLE'

    A titre d'exemple si j'instance une form dans une Sub , cette form ne sera visible que dans la Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub MaRoutine
      Dim MaForm As New Form1
      MaForm.MonControle.Visible=True
    End Sub
    Dans la Form créée, on utilise 'Me'
    Dans MaRoutine on utlise MaForm
    Hors de la SubMaRoutine MaForm n'est pas accesible.

    Pour avoir accès à l'instance d'une form dans un module, il faut par exemple instancer la form avec Public dans l'entête d'un module standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Module1
     
    Public MaForm as New Form1
    Ensuite MaForm.MonControle est accesible partout, et on peut écrire dans une Sub d'un moule :
    MaForm.MonControle.Visible=True

    Les Form c'est comme les variables, il faut les instancer et elles ne sont visibles que dans leur espace.

    J'espère que cela répond à ta question.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    désolé si je n'ai pas répondu avant, je suis en train de me documenter en détail sur les conseils de Piotrek.

    il est vrai que j'ai pas encore la programmation objet en tête donc je m'y fait mais très très lentement, j'ai surtout l'impression qu'en lisant tout ici et là c'est clair mais une fois dans la pratique c'est plus pareil.

    Je n'ai pas encore finit de me documenter sur ce qu'à dit Piotrek mais j'ai pas l'impression (peut être à tord) que ça répond à ma question à défaut de m'apprendre autre chose.

    En fait j'ai compris le principe qu'on doit instancier une variable du type de la feuille pour l'utiliser mais mon problème (enfin celui auquel je me heurte actuellement) est avec la feuille que j'ai définit par les propriétés comme étant la feuille de démarrage.

    Si ce n'était pas la feuille de démarrage du projet j'ai comme l'impression que je n'aurai pas eu le même problème car si j'avais fait un "dim f as new mafeuille1" je eux ensuite utiliser les propriétés et méthodes de mafeuille1 sauf que lorsqu'il s'agit de la feuille de démarrage je ne l'ai donc instancier nul part et dans ce cas comment la manipuler ? Récupérer dans une variable mafeuille1 qui est actuellement affiché ? comment ?

    je ne sais pas si je suis assez clair ou pas


    merci à tous les 2

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    oui donc j'ai fait le test et ça confirme ce que je pensais

    j'ai crée une procédure Main en démarrage et cette procédure main ne fait que la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public frm_mafeuille1 as new mafeuille1
    frm_mafeuille1.showdialog
    comme ça dans mes modules si je veux accéder aux contrôles de mafeuille1 je n'ai plus qu'à faire : frm_mafeuille1.moncontrol.visible=true

    mon problème est "résolu" (si on peut le dire comme ça) mais j'aimerai quand même par curiosité savoir comment il aurait fallu faire si je n'étais pas passé par ma procédure main ?

    Merci

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 92
    Points : 114
    Points
    114
    Par défaut
    mon problème est "résolu" (si on peut le dire comme ça) mais j'aimerai quand même par curiosité savoir comment il aurait fallu faire si je n'étais pas passé par ma procédure main ?
    Je dirais simplement, que les modules ne sont pas une bonne façon de procéder. D'ailleurs il me semble qu'en C# ils n'existent pas.
    A mon avis, ils sont simplement là pour faciliter la migration d'applis VB6. Sachant que lorsque tu compiles ton projet, tu auras une classe en lieu et place de ton module avec tes fonctions qui deviendront des méthodes statiques... En conséquent, il faut vraiment éviter ce genre d'architecture.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par ld9474
    mon problème est "résolu" (si on peut le dire comme ça) mais j'aimerai quand même par curiosité savoir comment il aurait fallu faire si je n'étais pas passé par ma procédure main ?
    Je dirais simplement, que les modules ne sont pas une bonne façon de procéder. D'ailleurs il me semble qu'en C# ils n'existent pas.
    A mon avis, ils sont simplement là pour faciliter la migration d'applis VB6. Sachant que lorsque tu compiles ton projet, tu auras une classe en lieu et place de ton module avec tes fonctions qui deviendront des méthodes statiques... En conséquent, il faut vraiment éviter ce genre d'architecture.
    ah ?

    et quelle architecture faut t'il adopter dans ce cas ?
    je ne suis pas contre de changer de méthode vu que je reprend du début avec dotnet

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 92
    Points : 114
    Points
    114
    Par défaut
    Ben le mieux est de créer des classes, des méthodes statiques uniquement là ou tu dois y accéder d'un peu n'importe ou dans le code, d'autres méthodes avec passage de form en paramètre si necessaire.
    Surtout faire attention avec les passages en ByVal et ByRef qui peuvent changer de façon significative les performances de l'application.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par ld9474
    Ben le mieux est de créer des classes, des méthodes statiques uniquement là ou tu dois y accéder d'un peu n'importe ou dans le code, d'autres méthodes avec passage de form en paramètre si necessaire.
    Surtout faire attention avec les passages en ByVal et ByRef qui peuvent changer de façon significative les performances de l'application.
    ok je vais voir ça de plus près
    je vous remercie à tous, j'ai trouvé les réponses à ce que je cherchais, je passe le sujet en "Résolu"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Ajouter dynamiquement des Events à une Feuille via un module de classe.
    Par comme de bien entendu dans le forum Excel
    Réponses: 4
    Dernier message: 10/06/2012, 07h11
  2. [XL-2003] Ajouter dynamiquement des Events à une Feuille via un module de classe.
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2012, 18h06
  3. Ecrire dans le code source d'une feuille via une macro?
    Par mazuno dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/07/2010, 14h48
  4. envoi d'une valeur dans une feuille via un formulaire
    Par guyanais dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/09/2008, 15h08
  5. Manipulation une feuille MDI
    Par kidrissi dans le forum Windows Forms
    Réponses: 11
    Dernier message: 16/04/2008, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo