Deplacer un ou plusieurs item d'une listbox vers la position de son choix via la souris

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 637 fois - Téléchargée 39 fois


Contenu du snippet

Voila, j'avais fait un code pour modifier la position d'un element d'une liste en glissant ce dernier avec la souris, que j'avais fait pour mon lecteur audio, pour pouvoir modifier mes listes en temps réel. Mais on veux parfois deplacer plusieurs chansons vers une autre position. J'ai donc essayer d'ecrire ce code.

C'est peut etre un peu lourd pour des codes qui se declenchent aux evenements Mouse_Up et Mouse_Down , mais je n'ai pas encore trouver d'autre moyen...

La valeur Multiselect de votre liste doit etre à "1 - Simple" . Je vais essayer plus tard, de refaire ce code avec le Multiselect "2 - extended".
L'interet ici du Simple, est qu'il nous est possible de deplacer des items qui ne se suivent pas dans la liste.

Source / Exemple :


Option Explicit
Dim tmpliste() As String
Dim tmp1() As String
Dim tmp2() As String
Dim i As Integer
Dim nnn As Integer

Private Sub List3_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
'permet de deselectionner tout par clic droit
If Button = 2 Then
For i = 0 To List3.ListCount - 1
List3.Selected(i) = False
Next i
Exit Sub
End If

'permet de reselectionner l'item sur lequel le deuxieme clic est effectué avant de glisser les objets
x = List3.ListIndex
For i = 0 To List3.ListCount - 1
If List3.Selected(i) = True Then
GoTo reselect
End If
Next i
Exit Sub
reselect:
List3.Selected(x) = True
End Sub

Private Sub List3_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then Exit Sub

'on reinitialise les 2 tableaux temporaires
ReDim tmp1(0)
ReDim tmp2(0)

x = List3.ListIndex 'definit la position future des elements
If List3.Selected(x) = False Then 'verifie si la dernier position ne fait pas parti des éléments selectionnés

'boucle qui verifie les éléments séléctionnés,et qui place dans deux tableaux : la valeur de l'éléments séléctionné, et sa position
For i = 0 To List3.ListCount - 1
If List3.Selected(i) = True Then
tmp1(UBound(tmp1)) = List3.List(i)
ReDim Preserve tmp1(UBound(tmp1) + 1)
tmp2(UBound(tmp2)) = i
ReDim Preserve tmp2(UBound(tmp2) + 1)
End If
DoEvents
Next i

If UBound(tmp1) = 0 Then Exit Sub 'si il n'y avait rien de séléctionné, on quitte la procedure

If tmp2(0) <= x Then 'verifie le sens du deplacement

ReDim Preserve tmp2(UBound(tmp2) + 1) 'on ajoute une position inutile au tableau tmp2 pour permettre a la boucle suivante de ne pas generer d'erreur

'boucle qui va supprimer touts les éléments séléctionner de leurs positions initiales :
Do Until UBound(tmp2) = 0
ReDim Preserve tmp2(UBound(tmp2) - 1) 'on decremente le nbre de position du tableau en preservant les données
nnn = UBound(tmp2)
  'boucle pour retrouver l'éléments qui correspond a celui séléctionné dans le tableau tmp1 :
  For i = 0 To List3.ListCount - 1
  If List3.List(i) = tmp1(nnn) Then
  List3.RemoveItem i
  GoTo danext 'evite de continuer inutilement la boucle for i = ...
  End If
  DoEvents
  Next i
danext:
DoEvents
Loop

'boucle qui place les elements aux positions séléctionnés :
For i = 0 To UBound(tmp1) - 1
DoEvents
List3.AddItem tmp1(i), x - UBound(tmp1) + i + 1
Next i

List3.ListIndex = x

Else

ReDim Preserve tmp2(UBound(tmp2) + 1) 'on ajoute une position inutile au tableau tmp2 pour permettre a la boucle suivante de ne pas generer d'erreur

'boucle qui va supprimer touts les éléments séléctionner de leurs positions initiales :
Do Until UBound(tmp2) = 0
ReDim Preserve tmp2(UBound(tmp2) - 1)
nnn = UBound(tmp2)

'boucle pour retrouver l'éléments qui correspond a celui séléctionné dans le tableau tmp1 :
 For i = 0 To List3.ListCount - 1
  If List3.List(i) = tmp1(nnn) Then
  List3.RemoveItem i
  GoTo danext2
  End If
 DoEvents
 Next i
danext2:
DoEvents
Loop

'boucle qui place les elements aux positions séléctionnés :
For i = 0 To UBound(tmp1) - 1
List3.AddItem tmp1(i), x + i
Next i
List3.ListIndex = x

End If
End If
End Sub

Conclusion :


J'ai fait pas mal de tests, je n'ai pas vu d'erreurs.
Faites le moi savoir si vous decouvrez une erreur.

A voir également

Ajouter un commentaire

Commentaires

cs_PROGRAMMIX
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011

J'ai apporté une petite modification à ton code en utilisant une variable pour tester le sens du déplacement.

En effet, si tu fais glisser un élément du haut vers le bas, le premier est déplacé après le second. Alors que si tu fais un glissé vers le haut, l'élément déplacé se met devant celui sur lequel on s'est arrêté avec la souris.

Donc au niveau du code, j'ajoute une variable DE qui prend la valeur de X dans _MouseDown et dans le code _MouseUp, je teste celle-ci.
If De > x then x = x -1

Ainsi, l'élément déplacé est toujours mis devant celui où on a lâché le bouton de la souris.
C'est juste gênant si on veut déplacer le premier élément après le dernier...
cs_kortal
Messages postés
39
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
23 février 2003

bon, et bien, bon travail batto !
c'est un petit bout de code plutot pratique. fallait y penser, et ca en dépannera surement plus d'un !
et puis le code marche du premier coup, sans avoir a apporter de retouches ;)
FirSteph
Messages postés
60
Date d'inscription
lundi 21 octobre 2002
Statut
Membre
Dernière intervention
7 octobre 2007

Moi je trouve tes 2 codes excellents et d'un grand interet, d'ailleurs c'est exactement ce qu'il me fallait ;)
Merci bcp pour tes codes, bonne prog !

FirSteph
hvb
Messages postés
939
Date d'inscription
vendredi 25 octobre 2002
Statut
Membre
Dernière intervention
27 janvier 2009
1
laissez un commentaire si vous ne comprenez pas l'interet... je sais pas si j'ai été clair dans la presentation du code

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.