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 :

Cacher une classe imbriquée à la Form1 [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Cacher une classe imbriquée à la Form1
    Bonjour,
    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/classes 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 ?
    ***********

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il faut les déclarer comme Private ou Friend

    Citation Envoyé par patrickvier Voir le message
    J'ai essayé de déclarer ces classes comme protected et/ou Friend... mais vb me génère une erreur.
    Quelle erreur ?

  3. #3
    Membre confirmé
    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
    Par défaut
    Bonsoir Thomas
    J'ai pris des bouts de mon code afin que vous compreniez ce que je veux faire.
    Les différentes classes sauf Form1 qui sera le programme appelant, seront compilées à part.
    Mon probleme est que je dois piloter une autre machine via une connexion tcpclient, et lui envoyer des commandes. Ces commande seront toujours les mêmes (start, stop, continue, etc...) mais dans 3 contexte différents (back, middle et front). Donc ma ligne commande dans form1 ressemblerai à ça :
    back.stage.Start()
    middle.director.stop()
    Donc le contexte à une importance capitale si je ne veux pas recopier 3 fois la même commande de Stage.Start() dans les 3 classes (maintenance plus simple, etc...).

    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
    ublic Class Form1
        Dim main As New pv_global_vizrt
        Dim middle As New pv_middle_vizrt
        Dim back As New pv_back_vizrt
    	Dim front As New pv_front_vizrt
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles connect.Click
            main.Global_Connect("192.168.1.64", "6100")
        End Sub
     
        Private Sub Button1_Click_1(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            main.Global_Disconnect()
            'main.
        End Sub
     
        Private Sub clearall_Click(sender As System.Object, e As System.EventArgs) Handles clearall.Click
            main.Global_ClearAll()
        End Sub
     
        Private Sub back_dirstart_Click(sender As System.Object, e As System.EventArgs) Handles back_dirstart.Click
            back.back_director_start("BACK_DIR")
        End Sub
     
        Private Sub Set_Container_Click(sender As System.Object, e As System.EventArgs) Handles Set_Container.Click
            back.TREE.SetGetContainer._Set("key$layer_id*GEOM*TEXT SET", Set_ContainerTxt.Text)
        End Sub
     
        Private Sub getcontainer_Click(sender As System.Object, e As System.EventArgs) Handles getcontainer.Click
            'GET_ContainerTxt.Text = back.SetGetContainer._Get("key$layer_id*GEOM*TEXT")
        End Sub
     
        Private Sub Back_Clear_Click(sender As System.Object, e As System.EventArgs) Handles Back_Clear.Click
            'back.Back_Clear()
     
        End Sub
     
        Private Sub test_cmd_Click(sender As System.Object, e As System.EventArgs) Handles test_cmd.Click
            back.stage.sShow("3.2")
            back.director.Start()
        End Sub
    End Class
    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
    67
    68
    69
    70
    71
    72
    ' Ceci est aussi une class compilée à part. elle contient des classes imbriquées (cSTAGE, etc...)
    Imports System.Net.Sockets
    'Imports System.Net
    Imports System.Text
    Public Class pv_global_vizrt
        'Private mTcpClient As TcpClient
        Private Shared Property mTcpClient As TcpClient
        Private Property EngineIP As String
        Private Property EnginePort As Integer
        'Private Property layer As String
     
        Public stage As New cSTAGE(Me)
        Public director As New cDIRECTOR(Me)
        Public tree As New cTREE(Me)
        Protected Property Layer() As String
     
        Protected Structure vcmd
            Const Stage As String = "*STAGE"
    		' etc...
     
        End Structure
     
        Private Sub testsend(ByVal thecommand As String)
            MsgBox("dans le global : " & thecommand)
        End Sub
     
        Public Class cSTAGE
            Dim MyLayer As pv_global_vizrt
            Public Sub New(ByVal getlayer As pv_global_vizrt)
                MyLayer = getlayer
            End Sub
            Public Sub sStart()
                Dim thecommand As String
                thecommand = MyLayer.Layer & vcmd.Stage & vcmd.Start ' Assemblage de la commande
                MyLayer.testsend(thecommand)
            End Sub
            Public Sub sStop()
                Dim thecommand As String
                thecommand = MyLayer.Layer & vcmd.Stage & vcmd.Stopp ' Assemblage de la commande
                MyLayer.testsend(thecommand)
            End Sub
        End Class
     
        Public Class cDIRECTOR
            Dim MyLayer As pv_global_vizrt
            Public Sub New(ByVal getlayer As pv_global_vizrt)
                MyLayer = getlayer
            End Sub
            Public Sub Start()
                Dim thecommand As String
                thecommand = "envoi d'un text issue de DIRECTOR "
                'GenCmd.SendCommand(thecommand)
            End Sub
        End Class
     
        Public Class cTREE
            Dim MyLayer As pv_global_vizrt
            Public Sub New(ByVal getlayer As pv_global_vizrt)
                MyLayer = getlayer
            End Sub
            Public Function Control_GET(ByVal ControlName As String) As String
                Dim thecommand As String
                thecommand = MyLayer.Layer & vcmd.CtrlGet & ControlName & vcmd.Gget
                'GenCmd.SendCommand(thecommand)
                Return 
            End Function
            Public Sub Control_SET(ByVal ControlName As String, ByVal ControlValue As String)
                Dim thecommand As String = MyLayer.Layer & vcmd.CtrlSet & ControlName & vcmd.Sset & ControlValue
                ' TODO : send la commande
            End Sub
        End Class
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' CECI est une autre classe qui sera compilée à part :
    Public Class pv_front_vizrt
        Inherits pv_global_vizrt
        Sub New()
            MyBase.Layer = "RENDERER*FRONT_LAYER"
        End Sub
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ' CECI est une autre classe qui sera compilée à part :
    Public Class pv_back_vizrt
        Inherits pv_global_vizrt
        Sub New()
            MyBase.Layer = "RENDERER*BACK_LAYER"
        End Sub
    End Class
    Dans Form1 je déclare des objects représentant les classes des contextes (back, front, middle).
    Dans la classe principale, je déclare des objects représentant les sous/classes (cSTAGE, cDIRECTOR, etc...).
    Donc, dans ma form1, je commence par saisir le contexte, puis la sous/classe (famille de commandes Stage), puis la commande (sStart).

    Mon soucis est que dans Form1, je ne veux pas voir les classes et sous/classes en tant que telle, mais seulement les objets qui y font référence.
    Si je definie mes sous/classes en friend, je ne peux plus accéder au contenu depuis form1...
    erreur : 'stage' ne peut pas exposer le type 'cSTAGE' en dehors du projet via class 'pv_global_vizrt'.

    J'espere avoir été assez clair...
    Si vous avez une solution, c'est super cool...

    Merci

    Patrick

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Si tu exposes publiquement une variable de type cDIRECTOR, alors cDIRECTOR doit forcément être public, il n'y a pas vraiment de moyen d'éviter ça... Tu pourrais éventuellement créer une interface implémentée par cDIRECTOR, et garder cDIRECTOR privée, mais tu ne peux pas masquer complètement le type d'une variable publique.

    Si tu veux juste ne pas voir cDIRECTOR dans l'intellisense sur une variable pv_global_vizrt, déclare là en dehors de pv_global_vizrt...

    Cela dit je trouve bizarre que l'intellisense de VB affiche les types imbriqués pour une variable, ça n'a pas vraiment de sens. Encore un truc que je peux ajouter à la (très longue) liste des défauts de VB.NET

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

Discussions similaires

  1. Changer le css d'une classe imbriquée en Javascript
    Par Timoune007 dans le forum jQuery
    Réponses: 7
    Dernier message: 09/07/2015, 16h04
  2. suppression d'éléments dans une classe imbriquée
    Par BernardBouree dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/11/2012, 22h29
  3. Exclusion de style dans une classe imbriquée
    Par guillaumeabxl dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 05/02/2011, 12h33
  4. [VB.NET] passage d'arguments d'une classe(form1) à une autre
    Par zouhib dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/05/2006, 17h54

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