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 :

transfert d'objet d'une class à l'autre [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut transfert d'objet d'une class à l'autre
    Bonjour,
    J'ai qlq soucis a faire passer un objet d'une classe à l'autre.
    Le code ci-dessous illustre mon probleme.
    Chacune de ces classes sera compilée à part.
    La Form1 sera le programme appelant.
    Dans mon form1, l'appel a myback.testlayer() passe par la class Back et fini dans la class general_cmd. Dans ce cas, je peux récupérer la variable "layer" definie dans la classe back. Là tous va bien.
    En revanche quand j'appelle "myback.cstage.StageStart()", je passe par la classe Back puis par la sous class STAGE et enfin je reviens dans la class general_cmd. En revanche la variable "layer" est vide... je l'ai donc perdu en court de route avec mon passage dans la sous class STAGE.

    Comment faire pour garder la valeur de "layer", même si je passe par plusieurs classes avec de me servir de "layer" ?

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Public Class Form1
        Dim myback As New Back
        Dim myfront As New Front
        'Dim mymiddle As New Middle
     
        Private Sub bback_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bback.Click
            myback.cstage.StageStart()
            myback.cdirector.DirectorStart()
            myback.testlayer()
        End Sub
     
        Private Sub bfront_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bfront.Click
            myfront.cstage.StageStart()
        End Sub
    End Class
     
    Public Class Back
        Inherits General_cmd
        ' ici le programme appelant doit passer et valider la variable mylayer=layer back
        Sub New()
            MyBase.Layer = "layer back"
        End Sub
    End Class
     
    Public Class Front
        Inherits General_cmd
        ' ici le programme appelant doit passer et valider la variable mylayer=layer front
        Sub New()
            MyBase.Layer = "layer front"
        End Sub
    End Class
     
    Public Class General_cmd
        Public cstage As New STAGE
        Public cdirector As New DIRECTOR
     
        Protected Friend Property Layer() As String ' propriété non vu par le programm Form1 mais vu par les classe de l'assembly -- Protected Friend
     
        Private Sub SendCommand(ByRef thecommand As String)
            ' ici une procédure qui génére qlq chose MAIS avec layer qui vient soit de la class Back ou Front et donc une valeur différente
            MsgBox(thecommand & Layer)
        End Sub
     
        Public Sub testlayer()
            Dim thecommand As String = "envoi d'un text issue de General_cmd"
            SendCommand(thecommand)
        End Sub
     
        Public Class STAGE
            Public Sub StageStart()
                Dim Send As New General_cmd
                Dim thecommand As String
                thecommand = "envoi d'un text issue de STAGE"
                Send.SendCommand(thecommand)
            End Sub
        End Class
     
        Public Class DIRECTOR
            Public Sub DirectorStart()
                Dim Send As New General_cmd
                Dim thecommand As String
                thecommand = "envoi d'un text issue de DIRECTOR"
                Send.SendCommand(thecommand)
            End Sub
        End Class
    End Class
    Merci de votre aide.

    Patrick

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    C'est normal, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Public Class STAGE
            Public Sub StageStart()
                Dim Send As New General_cmd
    Quand tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myback.cstage.StageStart()
    Tu crées directement une nouvelle instance de General_cmd sans passer par back ou front, donc layer n'est pas initialisé. (et tu crées aussi une autre instance de stage et director.)


    Pour que stage et director connaissent l'instance de general_cmd qui les a créées, il faut leurs passer celle-ci en paramètre. (le plus simple étant dans le constructeur)
    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
    Public Class General_cmd
        Public cstage As New STAGE(Me)
        Public cdirector As New DIRECTOR(Me)
     
        Protected Friend Property Layer() As String ' propriété non vu par le programm Form1 mais vu par les classe de l'assembly -- Protected Friend
     
        Private Sub SendCommand(ByRef thecommand As String)
            ' ici une procédure qui génére qlq chose MAIS avec layer qui vient soit de la class Back ou Front et donc une valeur différente
            MsgBox(thecommand & Layer)
        End Sub
     
        Public Sub testlayer()
            Dim thecommand As String = "envoi d'un text issue de General_cmd "
            SendCommand(thecommand)
        End Sub
     
        Public Class STAGE
            Dim GenCmd As General_cmd
            Public Sub New(ByVal GC As General_cmd)
                GenCmd = GC
            End Sub
            Public Sub StageStart()
                Dim thecommand As String
                thecommand = "envoi d'un text issue de STAGE "
                GenCmd.SendCommand(thecommand)
            End Sub
        End Class
     
        Public Class DIRECTOR
            Dim GenCmd As General_cmd
            Public Sub New(ByVal GC As General_cmd)
                GenCmd = GC
            End Sub
            Public Sub DirectorStart()
                Dim thecommand As String
                thecommand = "envoi d'un text issue de DIRECTOR "
                GenCmd.SendCommand(thecommand)
            End Sub
        End Class
    End Class
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Bonjour Hervé,
    Merci pour votre réponse. J'ai laissé mon projet de test sur une autre machine, mais il est certain que votre solution fonctionne. Cela me sauve d'une problème d'organisation dans mon programme, je pense que vous l'aviez compris.
    Hummm!!! maintenant j'ai un soucis de... "auto-completion".
    Comme vous pouvez le voir ci-dessous, lorsque je suis dans mon programme appelant (Form1), vb me propose plusieurs solution à la saisie de ma commande.
    Les Classes comme "DIRECTOR", "STAGE" (rouge) n'ont pas besoin d'être vu, seul les objets "cdirector" et "cstage" (bleu) seront nécessaires à la commande.

    J'ai essayé de déclarer ces classes comme protected et/ou Friend... mais vb me génère une erreur.

    Comment déclarer ces sous/classe afin qu'elles puissent fonctionner avec les autres classes mais pas vue dans l'"auto-completion" du programme appelant ?

    Ceci afin de ne proposer que ce qui est utile à l'écriture du prg appelant.
    Merci
    Patrick
    ***********
    PS : Peut être que la méthode de classes imbriquées n'est pas la meilleurs solution, faudrait-il créer des classes séparées soit dans le même fichier, soit des fichiers différents ?
    ***********

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par patrickvier Voir le message
    faudrait-il créer des classes séparées ?
    Cela déporterait simplement le problème.
    DIRECTOR et STAGE ne serait plus vu dans l'auto-completion de "back." mais au niveau du code de form1.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    bonsoir Hervé,
    donc, je suis battu pour cela...
    je ne peux donc pas cacher mes classes STAGE et DIRECTOR dans Form1, malgré la création de l'objet cstage dans la classe general_cmd.
    C'était juste pour un confort de création dans Form1
    Merci de ton aide.
    Patrick

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Citation Envoyé par patrickvier Voir le message
    je ne peux donc pas cacher mes classes STAGE et DIRECTOR dans Form1, malgré la création de l'objet cstage dans la classe general_cmd.
    C'est possible, mais cela alourdi le code.
    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
    Public Class General_cmd
        Protected cstage As New STAGE()
        '...
        Public Sub LanceStage()
            cstage.StageStart()
        End Sub
     
        Protected Sub SendCommand(ByRef thecommand As String)
            MsgBox(thecommand & Layer)
        End Sub
     
        Protected Class STAGE
            Dim GenCmd As General_cmd
            Public Sub New(ByVal GC As General_cmd)
                GenCmd = GC
            End Sub
            Public Sub StageStart()
                GenCmd.SendCommand("envoi d'un text issue de STAGE ")
            End Sub
        End Class
    Dans form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim myback As New Back
            myback.LanceStage()
    Après tu peux simplifier
    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
    Public Class General_cmd
        Protected cstage As New STAGE()
        '...
        Public Sub LanceStage()
            SendCommand(cstage.StageStart)
        End Sub
     
        Protected Sub SendCommand(ByVal thecommand As String)
            MsgBox(thecommand & Layer)
        End Sub
     
        Protected Class STAGE
            Public Function StageStart() As String
                Return "envoi d'un text issue de STAGE "
            End Function
        End Class
    A voir suivant les besoins.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Merci Hervé,
    en effet cela alourdi le code.
    en tout cas, c'est fromage ou dessert...
    dans l'immédiat, je vais peut être resté comme ça car je suis un peu pris par le temps. Mais après, je vais refaire ces dlls en y ajoutant ta solution.
    En tout cas merci pour ton aide précieuse.
    Je suis plutôt débutant là dessus et il semble que je m'attaque à un problème qui n'est pas des plus simples.
    De toute façon, il faut que je fasse ces dlls comme je le souhaite puisqu'elles me serviront plus tard.
    Merci encore pour ton temps.
    Patrick

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 26/03/2011, 20h40
  2. Binding listView et objet d'une classe dans une autre classe
    Par warmy dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 09/06/2009, 14h26
  3. Récupération d'objet d'une class à l'autre
    Par mamatt dans le forum Général Java
    Réponses: 7
    Dernier message: 04/01/2008, 15h12
  4. Réponses: 2
    Dernier message: 01/06/2007, 08h57
  5. Réponses: 2
    Dernier message: 30/12/2006, 13h34

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