Demande d'aide sur déclaration de classe et objet en VB.net

coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018 - 14 avril 2013 à 02:38
coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018 - 15 avril 2013 à 18:46
Bonsoir,
à titre d'exercice j'ai écrit un petit programme à l'aide de Visual studio express 2010 en VB. Le premier bouton déclenche l'affichage d'une ampoule allumée, le second bouton une ampoule éteinte.

Dans le Form il y a donc 2 boutons et une PictureBox.
Quand on clique sur un bouton, la procédure liée à cet événement modifie une propriété de la classe et passe à la procédure Affichage. Celle-ci teste la propriété et affiche l'image correspondante.
Idem pour le second bouton.

J'ai 2 erreurs que je ne parviens pas à résoudre.

La première se trouve dans la procédure déclenchée par le clic sur un bouton:
"La clause Handler requiert une variable WithEvents definie dans le type conteneur ou l'un de ses types de base"

La seconde se trouve dans la procédure Affichage:
"Une référence à un membre non partagé requiert une référence d'objet"

Je joint le code si quelqu'un veut bien y jeter un oeil.

Merci

Public Class Form1
    Public Class Lampes
        Public ampoule As New Lampes With {.allume = True}
        Public allume As Boolean

        Public Sub BtnAllumer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAllumer.Click
            ampoule.allume = True
            Affichage()
        End Sub
        Public Sub BtnEteindre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEteindre.Click
            ampoule.allume = False
            affichage()
        End Sub
        Public Sub affichage()
            If ampoule.allume = True Then
                PictureBox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Allumee.jpg"
            Else
                PictureBox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Eteinte.jpg"
            End If
        End Sub
    End Class

End Class

13 réponses

Utilisateur anonyme
14 avril 2013 à 15:31
Bonjour,

Avec un titre comme ça tu ne risques pas d'avoir beaucoup de réponses...
Crée un nouveau projet avec deux boutons uniquement et essaye ça:

Public Class Form1
    Dim Allume As Boolean = True
    Dim PictureBox1 As New PictureBox
    Dim PictureBox2 As New PictureBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Le fait de charger l'image jpg à chaque fois, ça rallenti considérablement l'application donc,
        'Exemple avec création des picturebox dynamiquement:
        PictureBox1.Load("D:\Mes Documents\Visual Studio 2010\Projects\Allumee.jpg")
        PictureBox2.Load("D:\Mes Documents\Visual Studio 2010\Projects\Eteinte.jpg")
        Me.Controls.Add(PictureBox1)
        Me.Controls.Add(PictureBox2)
        PictureBox1.BringToFront()
    End Sub

    Private Sub BtnAllumer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAllumer.Click
        PictureBox1.BringToFront()
        Allume = True
    End Sub

    Private Sub BtnEteindre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEteindre.Click
        PictureBox2.BringToFront()
        Allume = False
    End Sub
End Class


Tu me diras ce que tu en conclues.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 avril 2013 à 17:03
Salut

tu devrais revoir les notions des class
ici

lis tranquillement
0
coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018
14 avril 2013 à 22:10
Bonsoir,

Bruno, j'ai testé ton code mais ça ne répond pas au but que je m'étais fixé. Je voulais créer une classe et un objet et utiliser un attribut de cette classe.
Bon entre temps j'ai pu situer où se trouvait mon erreur. J'ai déplacé la ligne de création de la classe "Lampes" dans un autre module et j'ai mis la création de l'attribut "allume" dedans. Et ainsi cela fonctionne.
Par contre j'ai bien noté l'avantage que procure le fait de charger les images une seule fois.

ShayW, je connais le cours que tu as mis en lien et je voulais le mettre en pratique ...

Encore merci à vous,
a+

ps comment met-on Résolu ?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
14 avril 2013 à 23:02
Salut
ShayW, je connais le cours que tu as mis en lien et je voulais le mettre en pratique ...


bien justement

tu as crée ta class lampes
les évenement BtnAllumer et BtnEteindre
ne peuvent pas etre écrit dans la class lampes
car les deux boutons appartiennent à form1 et
non à class lampes
pareil pour le picturebox

aussi
Public ampoule As New Lampes With {.allume = True}

pourquoi créer une instance de ta class
dans ta class ?


soit tu écris une class qui herite de la class
form
c.a.d sur ta form tu n'ajoutes aucun bouton et
picturebox

Class lampes
inherits form
 WithEvents BtnAllumer As New Button
 WithEvents BtnEteindre  As New Button
 Private picturebox1 As New PictureBox
 private  allume As Boolean
 Public Sub New()
   BtnAllumer.Location = New point(10,10)
   BtnEteindre .Location = New point(BtnAllumer.right +  10,10)
 Me.Controls.Add(BtnAllumer)
 Me.Controls.Add(BtnEteindre)
 allume = true  
'decide où placer ta picturebox1
 picturebox1.location = new point(? ,? )        
 End Sub

 private Sub affichage()
    If  allume = True Then
      PictureBox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Allumee.jpg"
      Else
        PictureBox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Eteinte.jpg"
            End If
  End Sub
 Private Sub BtnAllumer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAllumer.Click
       Allume = True
       affichage
    End Sub

    Private Sub BtnEteindre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEteindre.Click
        Allume = False
        affichage
    End Sub
End Class


dans ta form
Public ampoule As New Lampes
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018
15 avril 2013 à 02:42
Salut ShayW,

J'avais clôturé cette discussion mais ton intervention m'a beaucoup intéressé. En effet je trouve ton code beaucoup plus clair et ça m'a fait découvrir pas mal de choses.
Néanmoins ça ne marchait pas.

La création de ampoule dans Form1 faisait planter le programme et comme je n'en voyais plus l'utilité, je l'ai supprimée.

Dans les propriétés de l'application,Formulaire de démarrage, j'ai du mettre "Lampe" à la place de Form1 (sinon il affichait le formulaire Form1 au de celui de Lampe.

Voici donc le code pour ceux qui comme moi débutent.
et merci à toi ShayW.

Public Class Lampe
    Inherits Form1
    WithEvents BtnAllumer As New Button
    WithEvents BtnEteindre As New Button
    Private picturebox1 As New PictureBox
    Private allume As Boolean

    Public Sub New()
        BtnAllumer.Location = New Point(40, 230)
        BtnEteindre.Location = New Point(150, 230)                    '(BtnAllumer.Right + 10, 10)
        'decide où placer ta picturebox1
        picturebox1.Location = New Point(99, 35)
        picturebox1.Width = 64
        picturebox1.Height = 85
        BtnAllumer.Text = "ALLUMER"
        BtnEteindre.Text = "ETEINDRE"
        BtnAllumer.Visible = True
        Me.Controls.Add(BtnAllumer)
        Me.Controls.Add(BtnEteindre)
        Me.Controls.Add(picturebox1)
        Me.Text = "Lampe"
        'allume = True


    End Sub

    Private Sub affichage()
        If allume = True Then
            picturebox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Allumee.jpg"
        Else
            picturebox1.ImageLocation = "D:\Mes Documents\Visual Studio 2010\Projects\Eteinte.jpg"
        End If
    End Sub
    Private Sub BtnAllumer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAllumer.Click
        allume = True
        affichage()
    End Sub

    Private Sub BtnEteindre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnEteindre.Click
        allume = False
        affichage()
    End Sub
End Class
0
Utilisateur anonyme
15 avril 2013 à 04:11
Bruno, j'ai testé ton code mais ça ne répond pas au bu


Euhh... il est où Bruno dans cette discution?
En plus tu te mets toi même une réponse acceptée, tu nous dis si t'as pas besoin de nous !...

Allez... La prochaine fois on le saura... malgré le code de Shayw gentillement fourni tu trouves le moyen de dire en plus:
J'avais clôturé cette discussion mais...


Tu n'avais pas du tout clôturé la discution, tu n'as fait que te mettre à toi même une réponse acceptée.

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
15 avril 2013 à 09:09
Hello,
Euhh... il est où Bruno dans cette discution?

Je suis là . Je ne fais que passer, je n'ai fait que changer le titre de la discussion...

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018
15 avril 2013 à 11:55
Bonjour Active,

Désolé pour la confusion de nom.

Tu as mal interprété mon action.

Je ne savais pas comment clôturer la discussion je l'ai d'ailleurs indiqué dans ma réponse du dimanche 14 avril 2013 à 22:10:59.
Comme mon problème était résolu et je n'avais pas de réponse à ma question concernant la clôture d'une discussion, j'ai cliqué sur le bouton "accepter cette réponse" en pensant que c'est ainsi que l'on clôturai une discussion.

D'autre part quand j'ai écrit
J'avais clôturé cette discussion mais ton intervention m'a beaucoup intéressé
C'était pour indiquer que la discussion rebondissait avec un apport intéressant.

Tout ça pour dire que je ne voulais être offensant pour personne.

Cordialement,
0
BunoCS Messages postés 15476 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 3 mai 2024 103
15 avril 2013 à 12:04
Comme mon problème était résolu et je n'avais pas de réponse à ma question concernant la clôture d'une discussion, j'ai cliqué sur le bouton "accepter cette réponse" en pensant que c'est ainsi que l'on clôturai une discussion.

Tu ne peux pas fermer la discussion. Par contre, le bouton "Réponse Acceptée" te permet de dire "Ok, cette réponse répond à mon problème".

@+
Buno, Admin CS
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 avril 2013 à 13:18
Salut
pas possible que ton code fonctionne en tout
cas pas chez moi

d'abord des fautes importantes dans ton code
Dans les propriétés de l'application,Formulaire de démarrage, j'ai du mettre "Lampe" à la place de Form1 (sinon il affichait le formulaire Form1 au de celui de Lampe.


pourquoi

tu dois écrire
Inherits Form
Formulaire de démarrage = lampe
et
tu as écrit
Public Class Lampe
  Inherits Form1


c.a.d la class lampe herite de la class form1
dans ta form1 tu as intancié ta class lampe
disons
Public Class Form1
 Private malampe As New Classlamp
end class

met le startup form à form1
je lance le prog avec le debugger F8
la 1er command qui doit etre éxecuté est
Private malampe As New Classlamp

donc on va dans la class lamp (constructor new))
dans ta class lamp
la 1er command a exécuté est
 Inherits Form1

donc on revient dans ta form1
mais la une loop infinit va se reproduire
avec l'erreur
An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll

la meme chose si tu definis startup form à
class lamp
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 avril 2013 à 13:26
erreur de ma part

ton code aussi fonctionne
seulement si ta form de démarrage est lampe
et supprimer l'objet ampoule dans form1
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
15 avril 2013 à 13:46
suite du feuilleton

en fait je ne vois pas l'éfficacité de créer
une class qui hérite de ta propre form
dans ce cas sers toi du code d'acive
tu n'as pas besoin de class lamp
0
coleoptere Messages postés 163 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 24 octobre 2018
15 avril 2013 à 18:46
Salut,
en fait je ne vois pas l'éfficacité de créer
une class qui hérite de ta propre form
dans ce cas sers toi du code d'acive
tu n'as pas besoin de class lamp

Comme je l'ai expliqué plus haut c'est un exercice que je me suis donné pour démarrer quelque chose en POO.
Cet exercice n'a aucune utilité, j'ai mis ce qui me passait par la tête à ce moment. Le but était de pouvoir manipuler des classes.
0
Rejoignez-nous