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

VB.NET Discussion :

Mutualiser du code sur des événements de contrôles


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Mutualiser du code sur des événements de contrôles
    Bonjour,

    J'ai un projet sous VB 2012.
    Je dois reproduire un TabPage d'une Form1 dans une autre Form2. Ce TabPage contient des contrôles standards comme des ComboBox ou ListBox.
    La Form1 contient pas mal de code pour gérer tous ces contrôles.

    Etant donné que je compte donner les mêmes noms aux différents contrôles sur les 2 Forms, est-il possible de mutualiser le code actuellement présent dans Form1 sans devoir créer une fonction pour chaque événement de chaque contrôle ?
    Si oui, comment faire ?

    Merci de votre aide.

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    BONJOUR

    De quoi s'agit-il au juste ?
    La mutuelle des risques du code ou quoi ?
    Si ton code est bien structure ,le code de gestion des évents peut être mis dans un class public à part ,et il suffit que les différents Forms ait une référence sur une instance de ce class et ses méthodes ....

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Je voudrais réutiliser le code gérant les contrôles (comme la sélection dans une Combo) dans plusieurs Forms.

    Pour l'instant, le code est dans une Form. Il faudrait donc que je créé une Class avec les différents événements que je veux gérer ?
    Dans cette Class, à la place de l'événement, je crée une fonction avec comme paramètre une ComboBox.
    Dans les Forms, à la place de chaque code présent dans les événements des contrôles, je fais appel aux différentes fonctions de la Class.
    Est-ce ce genre de choses que je dois faire ?

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    bonjour,

    si ton code gerant les controles se situe dans form1 et que tu dois le reutiliser ailleurs alors cela veut dire que ton projet est un poil mal ficelé .......
    Pour eviter d etre confronté a ce genre de problème on scinde le projet dans le meilleur des cas : en 3 parties (vue/modèle/controlleur) ou au pire en 2 parties (vue/modèle).
    breff.... je ne te dirais pas de repenser ton projet car à tes yeux cela sonnerait comme de la contre-productivité et de la perte de temps....
    Donc abordes les notions :

    - classe partagée
    - heritage eventuellement
    - interface (si tu possèdes un minima de classes bien structurées....)

    @+

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Une autre hypothèse c'est de faire de l'héritage de Form car tu laisses entendre que tu as des contrôles à dupliquer y compris leur code gestionnaire d'évènement ,
    Une autre solution à ce besoin consiste :
    1/ à créer un FormBase dérivé de l'actuel mais débarrassé des contrôles non communs ainsi que leur code gestionnaire d'évent
    2/ faire hériter ton Form actuel ainsi que les subséquents de ce Form de Base
    3/ rajouter autant de contrôles supplémentaires spécifiques à chacun d'eux...


    exemple
    1/FormBase avec ses contrôles (+ gestionnaires évents)
    2/ FormDeriveB,FormDeriveB
    3/Comment déclarer des évent Handler overridable et les modifier dans ces 2 derniers formes

    code .vb:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    Public Class FormBase
     
        Private Sub FormBase_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            For i As Integer = 1 To 10
                ComboBox1.Items.Add("Item" + i.ToString)
                ListBox1.Items.Add("Item" + i.ToString)
     
            Next
     
     
     
        End Sub
        'modifie comme overridable :son code sera modifie dans FormDeriveA
        Protected Overridable Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            MessageBox.Show("button1 base")
        End Sub
        'idem:   :son code sera modifie dans FormDeriveA  et  FormDeriveB
        Protected Overridable Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            MessageBox.Show(ComboBox1.SelectedItem.ToString)
        End Sub
     
     
     
    End Class
     
    'form herité A
    Public Class FormDeriveA
        Protected Overrides Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            MessageBox.Show("button1 DERIVEA")
        End Sub
        Protected Overrides Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
            MessageBox.Show(ComboBox1.SelectedIndex.ToString)
        End Sub
     
    End Class
     
     
    'form herité  B
    Public Class FormDeriveB
     
        Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
            'MyBase.OnLoad(e)
            ComboBox1.Items.Clear()
            For i As Integer = 1 To 5
                ComboBox1.Items.Add("ItemDerivedB" + i.ToString)
            Next
     
        End Sub
        Protected Overrides Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            ListBox1.Items.Add(ComboBox1.SelectedItem.ToString)
            Label1.Text = ComboBox1.SelectedItem.ToString
        End Sub
    End Class
    Pour hériter il suffit de créer un form et de rajouter ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Public Class Form1
        Inherits FormBase
     
    End Class
    et de generer le projet !!!

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    re

    Lien MSDN pour plus ample support (intitulé : Windows Forms Inheritance) :
    https://www.google.dz/url?sa=t&rct=j...39250283,d.d24

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci
    Je dois faire une évolution du projet, qui a certainement été mal initié car probablement fait par des non spécialistes de .Net.
    Je me doute que cela doit titiller des experts.

    Je ne suis pas non plus spécialiste de .Net. C'est pour cela que j'ai posé cette question car je supposais que ça pouvait se faire mais je ne savais pas trop comment.

    J'ai appliqué l'exemple de Mabrouki dans un mini projet et ca marche. Je croies avoir compris le principe.
    Par contre, les contrôles qui sont dans FormBase doivent être dans un TabPage et donc le TabControl n'est pas positionné au même endroit dans FormA et FormB.
    Et je n'ai pas réussi à déplacer mes contrôles hérités de FormBase dans FormA ou formB
    Est-ce possible ?

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    J'ai regroupé tous les controle de FormBase dans un GroupBox
    Dans le Form_Load de FromA, j'ai réussi à le positionner à peu près ou je voulais
    C'est la bonne méthode ? La seule solution ?
    En mode Cration graphique, on ne peut pas le déplacer ?

  9. #9
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Hobbi1 Voir le message
    J'ai regroupé tous les controle de FormBase dans un GroupBox
    Dans le Form_Load de FromA, j'ai réussi à le positionner à peu près ou je voulais
    C'est la bonne méthode ? La seule solution ?
    En mode Cration graphique, on ne peut pas le déplacer ?
    Lorsqu on fait de l heritage on a tout interet a travailler dans le constructeur et dans la majeure partie des cas oublier ce satané formLoad :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub New ()
        InitializeComponent 
        'On initialise les objets et on affecte.....
    end sub
    A savoir que le but de l heritage c est de pouvoir travailler dynamiquement avec une instance donc on oublie le mode graphique finalement.

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Donc j'oublie le mode graphique pour la partie héritage et le Form_Load : OK

    J'ai donc mis ça dans le New du FormB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            TabPage2.Controls.Add(GroupBox1)
            GroupBox1.Location = New System.Drawing.Point(20, 20)
    C'est cela qu'il faut donc faire ?

    PS : je suis désolé mais j'ai un accès restreint à internet et je n'ai pas les icônes de présentation telle que "Code"

  11. #11
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    oui si tu regardes le contenu de la procedure InitializeComponent tu verras que ca semble logique de faire comme cela.


  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je prend en cours et j'ai lu en diagonale
    mais pour factoriser du code interface il y a aussi les usercontrols et la délégation

    sur un usercontrol tu peux poser x controles et faire de l'interaction entre eux dans le code du usercontrol
    tu peux ensuite en poser sur tes forms directement

    concernant la délégation, c'est que si par exemple tu as un combobox qui une fois selected doit remplir un treeview, tu peux faire une méthode static quelque part qui demande un combobox (ou juste son selecteditem) et un treeview, et qui s'occupe de faire le remplissage de l'interface sans savoir où elle est
    au final sur tes forms tu appelles tes méthodes en leurs passant les controles nécessaires, et tu n'as bien le code qu'à un endroit
    (et là tu peux refactoriser rapidement en plus, car il suffit de déplacer le code actuel)


    y a plein d'autres possibilités, via les usercontrols toujours, tu peux y mettre une propriété de type listbox par exemple, et une fois posé visual studio te proposera les listbox présent sur le form pour mettre dans la propriété
    du coup ca fait qu'un controle peut connaitre celui auquel il doit etre lié et s'abonner à des events ou autre

    après ca dépend de ce que tu fais, mais en général si tu as plusieurs controles liés, et ce sur plusieurs forms, c'est qu'il te faut un usercontrol
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    D'ou mon intervention plus haut sur les classes partagées.
    En revanche, je n avais pas evoqué les userControl

  14. #14
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    OK. Merci.

    J'ai oublié de parler d'une petite subtilité : certains contrôles de FormBase possèdent du code spécifique lié au contexte fonctionnel. Il faudrait donc que certains événement exécutent le code mutualisé dans FormBase puis le code spécifique du même événement dans FormA ou FormB
    Je n'ai pas réussi en partant de la méthode de MABROUKI.

    N'est-ce pas possible ?
    Le usercontrol serait la meilleure solution aussi avec cette subtilité ?

  15. #15
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    comme nous l avons evoqué avec pol63 : utilises une classe avec des methodes partagées.
    non le usercontrol ne comblera pas ses lacunes........ ton projet est mal ficelé dès le depart c est pour cela que tu bricoles en mettant en place des notions qui te sont complètement obscures.

  16. #16
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    si j'utilise une classe avec des méthodes partagées, ca revient à ça ?
    * créer une Class avec une méthode pour chacun des différents événements que je veux gérer
    * dans les Forms, à la place de chaque code présent dans les événements des contrôles, je fais appel aux différentes méthodes de la Class

    Dans ce cas, il n'y a plus de notion d'héritage graphique ?
    Je ne peux avoir les 2 en l'état actuel du projet ?

    Si je peux un tout petit peu mieux ficeler le projet que je ne l'ai trouvé, je vais essayer

  17. #17
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    comme nous l avons evoqué avec pol63 : utilises une classe avec des methodes partagées.
    non le usercontrol ne comblera pas ses lacunes........ ton projet est mal ficelé dès le depart c est pour cela que tu bricoles en mettant en place des notions qui te sont complètement obscures.
    Mouais, l'utilisation des méthodes partagées pour effectuer des actions sur les formulaires c'est quand même bien du bricolage

    J'ai pas lu tout le besoin, mais la direction des contrôles utilisateurs me semble la meilleur.

  18. #18
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Mouais, l'utilisation des méthodes partagées pour effectuer des actions sur les formulaires c'est quand même bien du bricolage

    J'ai pas lu tout le besoin, mais la direction des contrôles utilisateurs me semble la meilleur.
    Le projet de départ c'est du bricolage...... on ne fait pas du neuf avec du vieux.... et si tu lis l'intégralité de ce sujet tu te rendras compte que d'autres suggestions ont été proposées.


  19. #19
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut

    Par contre, les contrôles qui sont dans FormBase doivent être dans un TabPage et donc le TabControl n'est pas positionné au même endroit dans FormA et FormB.
    Et je n'ai pas réussi à déplacer mes contrôles hérités de FormBase dans FormA ou formB
    Est-ce possible ?
    Oui ,j'ai donne le lien MSDN Fr qui explique tous ces détails:
    -dans le designer VS tu pointes sur ton TabControl du FormBase et dans la prop Friend tu sélectionnes :Protected Friend...
    -dans chaque TabPage ,tu selectionnes tous ses controls enfants et idem...
    Tu régénères ton projet et tu pourras dans le Form Derive les étirer ,déplacer ,titiller comme tu veux...
    Le "cadenas" de verrouillage graphique des controls dans le Form Derive aura disparu....!!!


    J'ai oublié de parler d'une petite subtilité : certains contrôles de FormBase possèdent du code spécifique lié au contexte fonctionnel. Il faudrait donc que certains événement exécutent le code mutualisé dans FormBase puis le code spécifique du même événement dans FormA ou FormB
    Je n'ai pas réussi en partant de la méthode de MABROUKI.

    N'est-ce pas possible ?
    Dans le meme lien MSDN Fr ce détail est aussi explique ...
    En effet pour exécuter le code de MyBase (FormBase ) ,ensuite le code nouveau inséré dans chaque event Handler la signature du Handler doit changer
    comme suit (c'est une autre version du FormDeriveA):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Public Class FormDeriveADOUBLE
        'note que Button1_Click  est renomme en  Button1_Click_1
        Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'code execute en plus du code de form de base
            MessageBox.Show("button1 DERIVEA")
        End Sub
     
        Private Sub ComboBox1_SelectedIndexChanged_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            'code execute en plus du code de form de base
            MessageBox.Show(ComboBox1.SelectedIndex.ToString)
        End Sub
    End Class
    Le tout est de savoir d'où on part et ce que l'on veut......

  20. #20
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci
    J'ai testé en modifiant la signature du Handler sur le projet de test. Ca donne ce que je voulais.

    Si c'est une solution qui est la "meilleure possible" en fonction du contexte et de l'historique, je vais partir là-dessus. Car il va bien falloir que je fasse mon évolution.

    @mabrouki : hier je n'avais pas pu accéder au lien que tu donnes. J'ai remplacé l'extension "dz" par "fr" et ca marche.
    Si on m'en laisse le temps, je vais étudier ça

Discussions similaires

  1. Comment ajouter du code sur un événement "onbeforeunload"?
    Par Nixar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/11/2010, 13h13
  2. Réponses: 1
    Dernier message: 18/10/2010, 11h07
  3. Réponses: 1
    Dernier message: 15/11/2008, 19h19
  4. statistiques sur des événements
    Par ram-0000 dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 06/06/2008, 11h45
  5. FFT code sur des modèles en finance
    Par Eric06 dans le forum Mathématiques
    Réponses: 7
    Dernier message: 12/06/2007, 23h32

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