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] Acceder a un objet de classe


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut [VB.NET] Acceder a un objet de classe
    Bonjour,

    J'ai une classe qui créer un panel avec des checkbox et la rattache a un form windows. Cette operation s'effectue en cliquant sur un bouton dans l'application.

    J'instance un objet de cette classe que je nomme "Panel_checkbox". Cette objet possède une proriété size vu qu il est herité de la classe panel.

    J'aimerais que lorsque je clique sur un deuxieme bouton je puisse changer cette propriété size pour "Panel_checkbox" et que cela s'affiche a l ecran par le changement de taille du panel.

    Or qd je créer l'évenement click sur le bouton2 je ne peus pas appeller Panel_checkbox vu qu il n'est pas accessible etant donné qu il n'est pas "crée" quand j'écris le code mais durant l'execution de l'application. et meme si je creer l'objet panel checbox dans l evenement rien ne se produit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Public Class Panel_information
            Inherits Panel
            Public Sub New()
                Dim Panel = New Panel
                'ajout des checkbox
            End Sub
        End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim Panel_checkbox = New Panel_information()
            Panel_checkbox.Size = New System.Drawing.Size(600, 100)
        End Sub
    Merci pour votre aide

  2. #2
    Membre expérimenté Avatar de LaChips
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 109
    Points : 1 482
    Points
    1 482
    Par défaut
    Bonsoir,
    la classe Panel_information ne s'écrit pas plutôt comme celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Class Panel_information
            Inherits Panel
            Public Sub New()
                MyBase.New()
                'ajout des checkbox
            End Sub
        End Class
    Ingénieur Multimédia - TMM Communication

  3. #3
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Sur code n°2 je vois que tu crée un Panel_information. C'est bien, mais t'en fais quoi après ? Si tu ne l'ajoute pas à la liste des composant de ta form il ne s'affichera jamais. Il sera créé en mémoire et c'est tout...
    Faut faut un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unContainer.Controls.add(Panel_checkbox);
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Je l ai bien rajouté au control j avais oublié de vous mettre cette ligne en effet vu qu elle était en bas de ma classe désolé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1.FlowLayoutPanel1.Controls.Add(Panel)
    Et je n'ai pas d erreur a la compilation ni meme de probleme d'affichage, le soucis c est qu'une fois que mon panel s affiche a l ecran et que j aimerais changer sa taille en cliquant sur un bouton la il ne se passe rien

    Si meme aprés je m amuse a faire dans un evement click d'un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim Panel_checkbox = New Panel_information()
            Panel_checkbox.visible = False
        End Sub
    Le panel reste visible

  5. #5
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    A mon avis, d'après les quelques lignes de code que j'ai pu voir, le problème vient du fait que tu ne récupères pas la bonne instance de ton panel.

    Ici, tu créés un nouvelle instance de ton Panel_checkbox qui n'a rien à voir avec le panel que tu as créés précédemment

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim Panel_checkbox = New Panel_information()
        Panel_checkbox.visible = False
    End Sub
    Maintenant, pour résoudre ton problème, il faut être plus clair !

    Ou se trouve ce Button2 ?
    Créés-tu tes panels sur ta form au moment du design ou génère-tu un nombre de panels non définis en fonction de paramètres à l'execution ?
    Si tu les créés au moment du design, pourquoi n'utilise-tu pas les instances déjà déclarés ?
    Si tu les créés à l'execution, comment définis-tu quel panel va affecter ton Button2, par exemple ?

    Après ça, je pense qu'on poura t'aider plus facilement ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Oui en effet je crée une nouvelle instance au lieu de recuperer la bonne faute de savoir comment, alors je vais essayer d'etre plus clair.J'apprecie vraiment votre aide je sais que ce n'est pas évident.

    Ou se trouve ce Button2 ?
    la procedure Private Sub Button2_Click se trouve dans le fichier form1.vb. dans la classe Form1.
    Le bouton lui je l ai creer en mode design il se trouve dans le fichier Form1.designer.vb et la ligne Me.Button5 = New System.Windows.Forms.Button se situe dans Private Sub InitializeComponent()

    Créés-tu tes panels sur ta form au moment du design ou génère-tu un nombre de panels non définis en fonction de paramètres à l'execution ?
    je les generent en fonction de radiobutton checker ou non par l'utilisateur pendant l execution

    Si tu les créés à l'execution, comment définis-tu quel panel va affecter ton Button2, par exemple ?
    je ne comprends pas la question, mais peut etre est ce justement pourquoi ca ne marche pas. C est la premiere fois que je travaille avec des classes et je n arrive pas a les manipuler une fois crée peut etre est ce parce que une classe dérivé de panel est plus subtil. j ai essayé de faire des refresh ensuite des update dans l espoir que la taille change mais sans succés

  7. #7
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    C'est effectivement un problème d'instance.
    Il faut que tu déclares ton objet Panel comme champs de ta classe. Tu pourra y accéder de n'importe où dans ta classe.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut
    Ok... et comment on fait ca? tu n aurais pas une ligne de code pour moi plz

    J'ai trouvé un de mes probleme en effet au lieu de faire Panel = new panel() dans ma classe il fallait que je fasse MyBase.new() et ensuite que j'utilise Me. comme reference a mon panel. Maintenant je peus modifier mon objet si je le crée et dans la meme procedure je change ses propriété comme size ou visible. Mais je ne sais toujours pas comment modifier ces propriété d'une procedure exterieure comme Private Sub Button2_Click

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut
    Bon j ai épuré un peu le code voila mon problème

    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
     
        Public Sub Creer_panel(ByVal enable_element)
            Dim Panel_checkbox = New Panel_information()
        End Sub
     
        Public Class Panel_information
            Inherits Panel
            Public Sub New(ByVal Num_porte, ByVal y)
                MyBase.New()
     
                Dim Button_valider As New Button
                AddHandler Button_valider.Click, AddressOf BouttonClique
     
                Button_valider.Location = New System.Drawing.Point(513, 132)
                Button_valider.Name = "Button_valider"
                Button_valider.AutoSize = True
                Button_valider.Text = "Valider"
                Button_valider.UseVisualStyleBackColor = True
                Me.Controls.Add(Button_valider)
     
                'creation de checkbox
     
                Form1.FlowLayoutPanel1.Controls.Add(Me)
            End Sub
        End Class
     
        Private Sub BouttonClique(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Panel_checkbox.size = New System.Drawing.Size(120, 120)
        End Sub
    Je voudrais que la procedure evenement BouttonClique change bien la taille du panel precedemment crée mais ca ne marche pas je sais pas.Comment le passer en parametre à la fonction ou si il y a un autre moyen.

    Merci !!!

  10. #10
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Bonjour,

    Ma dernière question te demander si tu avais plusieurs panels différents à gérer.

    Je crois avoir compris ce que tu veux faire, enfin j'espère...

    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
     
    Public Class MonForm
        Inherits System.Windows.Forms.Form
     
        Private WithEvents pnlCheckEnCours As PanelCheck
     
        '*** Click sur bouton1, 
        '*** Création du panel
        Private Sub Button1_Click( _
                        ByVal sender As System.Object, _
                        ByVal e As System.EventArgs _
                        ) Handles Button1.Click
            Try
     
                ' *** Tu peux ajouter ici un SuspendLayout
     
                ' Destruction du panel précédent
                ' Je ne sais pas trop bien si tu veux afficher plusieurs panels différents ou pas
     
                ' Si c'est le cas, ces instructions détruit le panel précédent.
                If Not IsNothing(pnlCheckEnCours) Then
                    pnlCheckEnCours.Visible = False
                    Me.Controls.Remove(pnlCheckEnCours)
                    pnlCheckEnCours.Dispose()
                End If
     
                ' Création du panel
                pnlCheckEnCours = New PanelCheck
     
                ' MEF de parametres
                ' *** Définit ici les propriétés de ton panel (visible, taille, ...)
     
                ' Ajout du Panel à la liste de controls du form
                Me.Controls.Add(pnlCheckEnCours)
     
            Catch ex As Exception
                ' Gestion des exceptions
                MsgBox(ex.ToString)
     
            Finally
                ' *** Tu peux ajouter ici un ResumeLayout
            End Try
        End Sub
     
        '*** Click sur bouton2, 
        '*** Création du panel
        Private Sub Button2_Click( _
                        ByVal sender As System.Object, _
                        ByVal e As System.EventArgs _
                        ) Handles Button2.Click
            Try
                ' Vérification instance pnlCheckEnCours
                If IsNothing(pnlCheckEnCours) Then Exit Sub
     
                ' On masque le panel
                pnlCheckEnCours.Visible = False
     
            Catch ex As Exception
                ' Gestion des exceptions
                MsgBox(ex.ToString)
            End Try
        End Sub
    End Class

    Par contre, si tu n'as qu'un seul panel à gérer, il faut créer ton composant au moment du Design et le gérer comme un panel normal.
    Tu le trouveras dans la boite à outils (Mes controls utilisateurs)




  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 159
    Points : 88
    Points
    88
    Par défaut
    Ok merci bcp donc ce n'est pas possible de manipuler un objet de classe qd qd il n est pas instancier a la creation de l'application mais a l'execution il faut detruire l ancien et en creer un nouveau avec les nouvelles caracteristiques qui remplace l ancien. Je pouvais chercher longtemps en effet vu que ce n'était pas possible. Je vais enfin pouvoir avancer

    Merci encore pour votre temps à tous. Je sollicite des fois un peu trop mais je me suis formé tout seul et des fois il y a des choses qui ne s'invente pas.

  12. #12
    En attente de confirmation mail
    Inscrit en
    Août 2006
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Août 2006
    Messages : 550
    Points : 669
    Points
    669
    Par défaut
    Tout est possible en programmation.

    Ce que je t'ai mis était un exemple.
    Tu peux très bien créer une instance à n'importe quel moment de l'execution.

    Le tout est de savoir comment tu accèdes à cette instance...

    D'ou l'importance des déclarations globales ou locales.
    Dans ton cas, tu avais créé une instance à l'intérieur du sub avec une déclaration local

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub CreationInstance
        Dim MonInstanceLocale As Object
     
        MonInstanceLocale = New Object
        ' ... Code
    End Sub
    A la fin de la procédure, tu n'as plus moyen d'accéder à ton instance car la déclaration MonInstanceLocale est détruite à la fin de la procédure.
    Ton instance existe toujours, mais tu n'as plus de variable déclarée qui te permet d'y accéder.

    Pour bien faire, il faut une déclaration globale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private MonInstanceGlobale as Object
     
    Private Sub CreationInstance
        MonInstanceGlobale = New Object
        ' ... Code
    End Sub
     
    Private Sub UtiliserInstanceGlobale
       MonInstanceGlobal.MaPropriete = True
    End Sub
    MonInstanceGlobale existe toujours à la fin de la procédure, et c'est ce qui va te permettre d'accéder à l'objet.
    MonInstanceGlobale sera detruite en même temps que la classe dans laquelle, elle est déclarée (en l'occurence, ton form)

    J'espère que c'est un peu plus clair.

    La portée des variables est quand même une chose fondamentale en programmation.
    On peut pousser la portée, pour qu'elle ne soit valable que dans un boucle For ou While par exemple...

    Bouquine un peu sur le sujet. Sur internet on trouve tout ce qu'il faut.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/08/2006, 10h34
  2. [vb.net 2.0]Acceder aux variable d'une classe
    Par kissskoool dans le forum Windows Forms
    Réponses: 8
    Dernier message: 21/06/2006, 19h54
  3. Réponses: 1
    Dernier message: 05/05/2006, 14h37
  4. acceder a un objet dans un CPropertySheet
    Par ludoviskm dans le forum MFC
    Réponses: 6
    Dernier message: 21/11/2004, 08h58
  5. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

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