Bouger des objets dans une Form

Résolu
a2x Messages postés 3 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 29 mars 2011 - 28 mars 2011 à 17:03
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 29 mars 2011 à 12:42
Bonjour à tous les codeurs

J’ai débuté la programmation il y a une semaine avec Visual Basic 2010 Express.
Je voudrais créer un code qui me permette de déplacé n’importe quel objets dans une Form.

Après plusieurs jours de recherche je suis tombé sur ce code.


Public Class Form1
Dim Go As Boolean
Dim LeftSet As Boolean
Dim TopSet As Boolean

Dim HoldLeft As Integer
Dim HoldTop As Integer

Dim OffLeft As Integer
Dim OffTop As Integer

Private Sub obj1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles obj1.MouseUp
Go = False
LeftSet = False
TopSet = False
End Sub
Private Sub obj1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles obj1.MouseDown
Go = True
End Sub


Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles obj1.MouseMove
If Go = True Then


HoldLeft = (Control.MousePosition.X - Me.Left)
HoldTop = (Control.MousePosition.Y - Me.Top)

If TopSet = False Then
OffTop = HoldTop - sender.Top

TopSet = True
End If
If LeftSet = False Then
OffLeft = HoldLeft - sender.Left

LeftSet = True
End If

sender.Left = HoldLeft - OffLeft
sender.Top = HoldTop - OffTop
End If
End Sub

End Class

Si j’ai bien compris avec ce code je devrais pourvoir bouger n’importe quel éléments qui est dans ma forme.
J’obtiens l’erreur suivante :


Si vous pouviez m’indiquer ou est mon erreur, ou si je n’ai pas compris le code.

L’adresse d’origine du code : origine du code.

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2011 à 07:17
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SetMoveable(Button1)
        SetMoveable(Button2)
        SetMoveable(Label1)
        SetMoveable(ListBox1)
        SetMoveable(CheckBox1)
    End Sub

    Dim depart As Point
    Dim deplacement As Boolean = False

    Private Sub SetMoveable(ByRef ctl As Control)
        AddHandler ctl.MouseDown, AddressOf Generic_MouseDown
        AddHandler ctl.MouseMove, AddressOf Generic_MouseMove
        AddHandler ctl.MouseUp, AddressOf Generic_MouseUp
    End Sub

    Private Sub Generic_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        'Mémorisation du point de départ
        depart = e.Location
        deplacement = True
    End Sub

    Private Sub Generic_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        If deplacement Then
            Dim bt As Control = DirectCast(sender, Control)
            Dim loc As Point
            loc.X = bt.Location.X + e.Location.X - depart.X
            loc.Y = bt.Location.Y + e.Location.Y - depart.Y

            'Chargement de la nouvelle position du control
            bt.Location = loc
        End If
    End Sub

    Private Sub Generic_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        deplacement = False
    End Sub
End Class



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
1
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
28 mars 2011 à 18:48
Bonjour a2x,

Dans ton code obj1 ne doit pas exister, ce qui explique l'erreur.

Pour déplacer un objet dans une forme il faut modifier les valeurs de la propriété Location.

Pour ce faire, tu peux faire comme suit :

Met un button sur ta form. Le button se nomera button1. Puis, colle le code suivant.

   Dim départ As Point
    Dim Dplt As Boolean = False

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
        'Mémorisation du point de départ
        départ = e.Location
        Dplt = True
    End Sub

    Private Sub Button1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseMove
        If Dplt Then
            Dim bt As Button = DirectCast(sender, Button)
            Dim loc As Point

            loc.X = bt.Location.X + e.Location.X - départ.X
            loc.Y = bt.Location.Y + e.Location.Y - départ.Y

            'Chargement de la nouvelle position du control
            bt.Location = loc
        End If
    End Sub

    Private Sub Button1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseUp
        Dplt = False
    End Sub
0
a2x Messages postés 3 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 29 mars 2011
28 mars 2011 à 19:47
Je vous remercie ccito, le code fonctionne à merveille sur le bouton.

La raison pour laquelle j’avais recherché le code posté au départ c’est qu’il devrait pouvoir déplacer n’importe quels objets sur une Form avec possibilité de ne pas faire référence à son nom.

Le problème c’est si j’ai 20 objets à déplacé sur une forme il faudra créer autant de foi le code qu’il y a de contrôle.

Je vous remercie pour votre attention et je vais de se pas continuer à rechercher comment faire.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2011 à 07:08
Le problème c’est si j’ai 20 objets à déplacé sur une forme il faudra créer autant de foi le code qu’il y a de contrôle.


NON !

les Handlers sont là pour ça...
AddHandler doit bien exister en VB...



Après plusieurs jours de recherche je suis tombé sur ce code.


Ah... il est loin le temps ou pour faire quelque chose de précis on essayais toutes les lignes de code possible... là, un coup de google et hop!

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0

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

Posez votre question
a2x Messages postés 3 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 29 mars 2011
29 mars 2011 à 11:27
Bonjour Renfield, je vous remercie le code fonctionne à merveille.
Personnellement j’ai commencé la programmation il y a 8 jour donc pour moi il y a encore beaucoup de chose abstraite, notamment au niveau des termes utilisé.

J’ai 46 ans et je n’aie jamais fait de programmation et me retrouve bien malgré moi à devoir fabriquer quelque petit logiciel pour la boite.

Je comprends votre point de vue j’ai rencontré les mêmes problèmes avec la 3D ou je passais mes soirée à répondre comment modélisé tel ou tel objet.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2011 à 12:42
Pour creuser un peu plus le code, au final, tout ce joue là:

AddHandler ctl.MouseDown, AddressOf Generic_MouseDown

on ajoute Generic_MouseDown comme gestionnaire des messages recu lors de la levée de l'evenement MouseDown de notre controle.

la seconde partie de la ruse est en fait un des B.A.BA de .Net:
l'objet ayant levé un evenement est transmis a celui-ci (Sender).

ainsi:

Dim bt As Control = DirectCast(sender, Control)

permet de récupérer dans bt le controle concerné par l'evenement.


Pour conclure, concernant mon "point de vue"...
rien ne m'oblige a venir aider sur le Forum ou tenter de le faire...
je ne suis pas aigri et comprend tout a fait qu'il faut bien débuter quelque part...
Là où je suis plus critique, c'est plutôt face au comportement de certains qui veulent la ligne de code qui leur manque, point barre ; sans comprendre.

C'est cette recherche de l'explication qui fera que tu penseras autrement peut etre la prochaine fois, que tu penseras a d'autres solutions, etc.

Important donc de chercher a voir ce qui se trame en coulisses ^^

donc si question il y a , n'hésites pas, le forum est reactif...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Rejoignez-nous