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 :

déclarer variable withevents


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut déclarer variable withevents
    Bonjour,

    J'essaye décrire un petit programme tant bien que mal, je me débrouille mais cette fois ci j'aurai vraiment besoin d'une aide extérieure.

    J'ai écrit mon premier message hier, et le problème a été résolu en 15min grâce à un membre.

    Mon nouveau problème est celui-ci:

    Mon programme comporte une form dans laquelle se trouve un chart.

    J'ai créé un évènement chart_mousedown pour insérer une shape sur le chart lorsque je clique sur la souris. Les shape insérées s'appellent shape1 et shape2
    Jusque là tout va bien.

    Maintenant, imaginons que l'emplacement des shape ne me convienne pas et que je souhaite les déplacer. J'aimerais pouvoir sélectionner la shape1 ou la shape2 puis la déplacer où je veux sur mon chart.

    Je pense devoir utiliser des évènement

    shape1_mousedown....

    puis

    shape1_mousemove...

    et enfin

    shape1_mouseup....

    Les shape1 et shape2 étant créées une fois le programme lancé, je ne parvient pas à écrire le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Private Sub shape1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles shape1.MouseDown
    sans qu'il me génère une erreur après le Handles :

    Erreur 1 La clause Handles requiert une variable WithEvents définie dans le type conteneur ou l'un de ses types de base.
    J'espère avoir été clair.

    Merci à vous!

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En fait, j'ai inséré un bout de code me permettant de sélectionner la shape que je veux bouger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Public Sub SelectShape(ByVal shape As Microsoft.VisualBasic.PowerPacks.Shape)
            ' Select the control, if it can be selected.
            If shape.CanSelect Then
                shape.Select()
     
            End If
    Mais comment récupérer le shape.select() dans un évènement type MouseDown etc...

    Merci.

  3. #3
    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
    handles signifie que la méthode précitée sera déclenchée sur les évènements suivant handles (on peut en mettre plusieurs sur la même sub)
    on appelle ca s'abonner à un évènement

    on a le droit d'écrire handles seulement sur les variables déclarée avec withevents

    pour ca il faut remplacer ta ligne qui doit ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private shape1 as new shape
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private withevents shape1 as new shape
    quand on veut s'abonner à un évènement pendant l'exécution (sur une variable instancier dans une sub par exemple) il existe addhandler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addhandler instance.event, addressof lasub
    pour retirer un abonnement ajouté avec addhandler il faut remplacer addhandler par removehandler



    pour le déplacement c'est bien le principe, sur mousedown noter quelque part qu'on est en train de déplacer, sur mousemove si on est en train de déplacer on modifie x ou y selon le delta
    et sur mouseup on not qu'on est plus en déplacement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    EDIT : Devancé par Pol63, toujours aussi rapide

    Bonjour,

    dans votre class, vous devez avoir une variable nommée shape1 de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private shape1 as shape
    il vous faut, comme marqué dans votre message, rajouter WithEvents devant le nom de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents  shape1 as shape
    Un petit lien pour vous aider à comprendre : FAQ

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Je vous remercie beaucoup pour ces précieux conseils.
    Je vais mettre ça en application et vous tiens au courant des résultats.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Alors j'ai essayé avec un ptit bout de code et ça marche

    Mais ceci a soulevé un autre problème : l'affection de noms à mes shape.

    J'ai l'impression de ne plus y rien comprendre.

    avec l'évènement MouseDown de mon chart1, voici le code pour ajouter une shape à chaque clique de souris :

    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
     
    Public Sub Chart1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseDown
     
            nclick = nclick + 1 'numéro du click de souris
     
            '-----------------ajout du point sur le graph--------------------
     
     
            Dim ax As Single = e.X
            Dim ay As Single = e.Y
     
            Dim canvas As New ShapeContainer
     
            canvas.Parent = Me.Chart1
     
            theShape.Parent = canvas
            theShape.Name = "theShape" & nclick
            theShape.Size = New System.Drawing.Size(10, 10)
            theShape.BackStyle = BackStyle.Opaque
            theShape.BackColor = Color.Blue
            theShape.BorderColor = Color.Blue
            theShape.Location = New System.Drawing.Point(ax - 5, ay - 5)
    problème, avec withevents je ne peux déclarer que theShape, comment dois-je faire pour créer un évènement mousedown sur le theshape2 ou theShape3...

    Merci

  7. #7
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private withevents theshape1 as shape
    private withevents theshape2 as shape
     
    private sub theshape1_mousedown(...) handles theshape1.mousedown
    end sub
     
    private sub theshape2_mousedown(...) handles theshape2.mousedown
    end sub
    tu peux regrouper tous les mousedown sur un seule sub via

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private sub theshape1_mousedown(...) handles theshape1.mousedown, thespahe2.mousedown
    il faudra alors utiliser sender qui contiendra l'instance de theshape ayant levé l'évènement
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse, mais j'avais essayé cette méthode sans entière satisfaction.

    En effet lorsque j'écris le code suivant

    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
     
    Private WithEvents theShape1, theShape2, theShape3, theShape4 As New OvalShape
    .'blabla
    .
    Public Sub Chart1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseDown
    .'blabla
    .
    .
    dim theShape as new OvalShape
     
    theShape.name=("theShape" & i) 'très important car boucle sur le i
    .
    .'blabla
    .
    end sub
     
    Private Sub theShape1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles theShape1.MouseDown
     
            ' AddHandler theShape.MouseDown, AddressOf theShape_MouseDown
     
            theShape1.BackStyle = BackStyle.Opaque
            theShape1.BackColor = Color.Blue
            theShape1.BorderColor = Color.Blue
        End Sub
    ma shape est bien créée et insérée, mais l'évènement MouseDown ne fonctionne pas dessus.

    En revanche si je force en remplaçant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim theShape as New OvalShape
    theShape.name=("theShape" & i ) 'i =1
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dim theShape1 as New OvalShape
    là l'évènement MouseDown fonctionne , mais lorsque qu'une shape est créée, elle efface et remplace l'ancienne sur le Chart.
    Donc?

    J'espère que vous comprenez mon problème.
    Je pense que la solution est très simple mais je n'ai pas encore assez de recul sur la programmation VB pour résoudre ce problème seul.

    Merci à vous.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Je vais faire plus simple :


    voilà ce que je désire faire :

    Lorsque je clique sur la souris, une shape s'insère, imaginons que je clique 50 fois :
    -quel nom de variable donner à chaque shape?
    -si possible peut-on attribuer un nom de variable dynamique (j'ai pas besoin d'en créer d'avance comme ça)
    - comment affecter un évènement à chaque variable créée dynamiquement

    En parcourant certains forum, j'ai vu que la commande Load () permettantd'ajouter des objets dynamiquement.

    je pensais à écrire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Load(theShape(nclick))
     
            With theShape(nclick)
                .visible = True
                .Parent = canvas
                .Name = "theShape" & nclick
                .Size = New System.Drawing.Size(10, 10)
                .BackStyle = BackStyle.Opaque
                .BackColor = Color.Blue
                .BorderColor = Color.Blue
                .Location = New System.Drawing.Point(ax - 5, ay - 5)
            End With
    avec en entête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private WithEvents theShape As New OvalShape

    mais il ne veut pas prendre le load. Qu'ai-je oublié de déclarer?


    Merci.

  10. #10
    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
    si à chaque clic tu dois créer un shape, il ne faut pas déclarer des variable shape
    car ca fait du code à écrire pour rien et ca limite le nombre de shape qu'on peut utiliser
    il faut les créer à l'exécution, et les stocker dans une collection
    le nom de la variable ne sert alors pas à grand chose
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si à chaque clic tu dois créer un shape, il ne faut pas déclarer des variable shape
    car ca fait du code à écrire pour rien et ca limite le nombre de shape qu'on peut utiliser
    il faut les créer à l'exécution, et les stocker dans une collection
    le nom de la variable ne sert alors pas à grand chose
    Merci du conseil.

    Même si je ne sais pas du tout comment faire, je vais me renseigner sur les "collections"

  12. #12
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par atiroocky Voir le message
    -quel nom de variable donner à chaque shape?
    -si possible peut-on attribuer un nom de variable dynamique (j'ai pas besoin d'en créer d'avance comme ça)
    C'est tout à fait possible comme vous le faite, avec une variable incrémentée mais le nom n'est pas obligatoire, le système se chargeant d'en donner un...

    Citation Envoyé par atiroocky Voir le message
    - comment affecter un évènement à chaque variable créée dynamiquement
    Quand on vous donne un lien dans un message précédent, il faut aller voir, ça évite de poser des questions dont la réponse se trouve dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AddHandler Button1.Click, AddressOf BoutonUnClick
    Ce code est bien sur a adapter aux Shapes

    Citation Envoyé par Pol63 Voir le message
    si à chaque clic tu dois créer un shape, il ne faut pas déclarer des variable shape
    car ca fait du code à écrire pour rien et ca limite le nombre de shape qu'on peut utiliser
    il faut les créer à l'exécution, ... , le nom de la variable ne sert alors pas à grand chose


    Citation Envoyé par Pol63 Voir le message
    et les stocker dans une collection
    On peux le faire mais personnellement j'utilise la collection par défaut Canvas.Children

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Sankasssss Voir le message
    C'est tout à fait possible comme vous le faite, avec une variable incrémentée mais le nom n'est pas obligatoire, le système se chargeant d'en donner un...
    merci, mais je ne parviens pas à incrémenter ma variable theShape à chaque click.

    J'avais vu la commande addhandler, mais pour l'utiliser il faut que je puisse incrmenter ma variable correctement.

    Merci des conseils.

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Avec ceci tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        dim theShape as new Shape
            With theShape
                .visible = True
                .Parent = canvas
                .Size = New System.Drawing.Size(10, 10)
                .BackStyle = BackStyle.Opaque
                .BackColor = Color.Blue
                .BorderColor = Color.Blue
                .Location = New System.Drawing.Point(ax - 5, ay - 5)
            End With
        AddHandler theShape.MouseDown , AddressOf Chape_MouseDown

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Mars 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    merci pour votre réponse!

    Dernière question:

    Comment différencier les shape créées (shape 1 shape 2...)?

  16. #16
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Dans votre évènement, vous avez le sender :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sender As System.Object
    Et vous avez toujours la collection de shape : Canvas.Children

  17. #17
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2013
    Messages : 36
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Pour obtenir l'object à la base de l'événement tu peux réaliser ce test dans ta Sub theShape_MouseDown :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If sender Is Shape1 Then
     
       ElseIf sender Is Shape2 Then
     
       End If
    mais dans ton cas, ça ne t'avances à rien car tu crées dynamiquement tes Shape.
    Ce que tu peux faire, c'est y accéder directement par le "sender"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim objSource as Shape = DirectCast(sender,Shape)
    ainsi que tu peux travailler directement dessus et accéder aux propriétés.

Discussions similaires

  1. [WD17] déclarer variable globale et procedure globale dans une fenetre
    Par java_j2ee dans le forum WinDev
    Réponses: 3
    Dernier message: 14/11/2013, 18h05
  2. TOAD ORACLE : Déclarer variable globale
    Par codeste dans le forum PL/SQL
    Réponses: 6
    Dernier message: 24/06/2013, 11h42
  3. [1.x] déclarer variables statiques dans une classe controller
    Par flora806 dans le forum Symfony
    Réponses: 8
    Dernier message: 15/10/2012, 17h26
  4. déclarer variables globales
    Par lanimal37 dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 29/08/2011, 14h18
  5. Déclarer variable sous Visual C++
    Par Tractor dans le forum Débuter
    Réponses: 11
    Dernier message: 20/04/2010, 12h08

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