Faire glisser un élément dans une listbox façon "winamp"

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 643 fois - Téléchargée 34 fois

Contenu du snippet

Alors plutot que d'utiliser deux boutons "Monter" et "Descendre" pour modifier la position d'un élément sélectionné dans une ListBox, je trouve plus sympa et aussi plus pratique de pouvoir le faire glisser avec la souris jusqu'à la position désirée (comme pour la playlist de Winamp par exemple)

Je tiens à remercier "hvb" dont la source ( http://www.vbfrance.com/code.aspx?id=4908 )m'a été bien précieuse, mais qui a malheureusement pour défaut de ne pas modifier la ListBox en "temps réel", mais seulement lorsque l'on relache le bouton de la souris.

Source / Exemple :


Dim ancien_index As Integer 'index de l'élément de départ
Dim nouvel_index As Integer 'nouvel index de la souris en "temps réel"
Dim nom_index As String 'nom de l'élément de l'ancien index

'Action à effectuer lors d'un clic gauche de la souris sur un élément de la liste
Private Sub Liste1_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
ancien_index = Liste1.ListIndex
End Sub

'Action à effectuer lors d'un mouvement de la souris dans la liste
Private Sub Liste1_MouseMove(button As Integer, shift As Integer, x As Single, y As Single)
If button = 1 Then 'il faut évidemment que le clic gauche reste enfoncé
    nouvel_index = Liste1.ListIndex
    If nouvel_index <> ancien_index Then 'il faut aussi que la souris ai quitté l'ancien élément
        'on inverse ensuite les deux éléménts
        nom_index = Liste1.List(ancien_index)
        Liste1.RemoveItem ancien_index
        Liste1.AddItem nom_index, nouvel_index
        'on modifie enfin l'index de l'élément séléctionné
        Liste1.ListIndex = nouvel_index
        'on reinitialise l'ancien index a la nouvelle position
        ancien_index = nouvel_index
    End If
End If
End Sub

Conclusion :


Je ne crois pas qu'il y est de bugs : la source dont je me suis inspiré n'en avait déja pas j'avais pas envie d'en rajouter ;)
merci de m'envoyer vos réactions :)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
3
Date d'inscription
samedi 27 octobre 2007
Statut
Membre
Dernière intervention
17 février 2008

Non!l nom d mon listbox est listbox1 ce qui fai que ancien_index=listbox1.listindex
mais il souligne sur listindex par ce quel ne figure pas!!!
Messages postés
35
Date d'inscription
dimanche 20 juillet 2003
Statut
Membre
Dernière intervention
13 février 2008

La seule raison plausible qui me vient à l'esprit serait que tu n'ais pas déclaré la variable 'ancien_index' globale afin de la rendre visible partout dans ton code... Sinon, si le nom de ta Sub est 'Liste1_MouseDown', est-ce que ta liste a bien le même nom 'Liste1' ?

Ajoutes cette ligne 'Debug.Print (ancien_index)' dans la Sub Liste1_MouseMove(...) à l'intérieur de la 2ème boucle IF pour vérifier (dans la fenètre 'immediate') que la variable 'ancien_index' ait gardé sa valeur.

A part ça je ne vois pas, ou bien le problème vient d'ailleurs.
Messages postés
3
Date d'inscription
samedi 27 octobre 2007
Statut
Membre
Dernière intervention
17 février 2008

j'ai un ptit probléme avec ton code , c'est que
Private Sub Liste1_MouseDown(button As Integer, shift As Integer, x As Single, y As Single)
ancien_index = Liste1.ListIndex
End Sub
ne veut pas marcher!:s:s
stp!si vous pouvez m'aider ca serai gentil de votre part!
Messages postés
295
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
24 janvier 2014
1
simple et efficace ! on pourrais peut etre éviter de redéclarer à chaque mouse_move les variables suivantes :

# Dim nouveau As Integer 'nouvel index de la souris en "temps réel"
# Dim temp As String 'nom de l'élément de l'ancien index

sinon rien à dire sinon bravo
Messages postés
35
Date d'inscription
dimanche 20 juillet 2003
Statut
Membre
Dernière intervention
13 février 2008

je vous remercie tous pour vos feedbacks, content que ça vous plaise.

Par contre hvb, désolé mais je n'ai vraiment que peu de temps libres pour programmer et j'ai mon programme à finir en priorité. Peut être plus tard...

Bonne prog à tous !
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.