Glisser déposer à l'intérieur d'une listbox ?

cs_benedict Messages postés 187 Date d'inscription mercredi 25 septembre 2002 Statut Membre Dernière intervention 7 mai 2009 - 25 mai 2004 à 11:32
Mooiz Messages postés 128 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 8 juillet 2005 - 25 mai 2004 à 15:28
Je voudrais déplacer les éléments d'une listbox de façon à changer leur ordre en utilisant dragdrop.

Est-ce possible ?

Un petit exemple de code ?

Merci de tout coeur.

Benedict :)

4 réponses

pcpunch Messages postés 1243 Date d'inscription mardi 7 mai 2002 Statut Membre Dernière intervention 18 février 2019 5
25 mai 2004 à 14:31
Voila une solution que g fait vite fait:

Dim Lindex1 As Integer

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)If Me.MousePointer <> 7 Then Lindex1 List1.ListIndex: Me.MousePointer 7: Exit Sub

If Me.MousePointer = 7 Then
Dim Tmp As String
Tmp = List1.List(Lindex1)
List1.List(Lindex1) = List1.List(List1.ListIndex)
List1.List(List1.ListIndex) = Tmp
Me.MousePointer = 0
End If
End Sub


Tu selectionne avec un click gauche l'élément a déplacer-> le curseur change-> tu reclick et ca inverse les 2!!!

Une solution parmis tant d'autre++++
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 mai 2004 à 15:02
Tiens, tu pourrais peux-être adapter le code situé a cette adresse ?
0
Mooiz Messages postés 128 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 8 juillet 2005
25 mai 2004 à 15:16
Bon meme si pcpunch a posté un solution, je donne la mienne, surtout parce que j'ai pas compris le probleme de la même manière :

' 2 variables globales à ne pas oublier sinon ca marche pas
Dim monIndex As Integer
Dim a As String

Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    monIndex = Fix(ListBox1.TopIndex + Y / 12)
    a = ListBox1.List(monIndex)
End Sub

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    ListBox1.RemoveItem (monIndex)
    monIndex = Fix(ListBox1.TopIndex + Y / 12)
    if monindex<0 then monindex=0
    temp = ListBox1.ListCount - 1
    ListBox1.AddItem (a)

    For i = monIndex To temp
        ListBox1.AddItem (ListBox1.List(i))
    Next
    For i = monIndex To temp
        ListBox1.RemoveItem (monIndex)
    Next
End Sub


C'est moins propre et plus consommateur de ressource mais ca fait un vrai drag&drop ;)
L'autre différence, c'est qu'au lieu d'echanger 2 éléments, ca met l'élément sélectionner avant l'élément sur lequel on le fait glisser.

    monIndex = Fix(ListBox1.TopIndex + Y / 12)


le 12 determine la hauteur du texte en pixel (au jugé ;) mais il vaudrait mieux utiliser les API qui vont bien pour le faire suf que je ne me souviens plus de leur nom -> your turn

voila
0
Mooiz Messages postés 128 Date d'inscription mercredi 25 juin 2003 Statut Membre Dernière intervention 8 juillet 2005
25 mai 2004 à 15:28
NB : ca a été fait en VBA donc les fonctions sont moins puissantes qu'en VB. Après lecture repide du code proposé par Renfield, je pense que la deuxième methode peut être grandement simplifiée :

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

ListBox1.RemoveItem (monIndex)
monIndex = Fix(ListBox1.TopIndex + Y / 12)
if monindex<0 then monindex=0
ListBox1.AddItem (ListBox1.List(i),monIndex)
end sub

Ca peut marcher si la methode additem supporte l'insertion d'un élément à un autre endroit qu'en derniere position, ce qui n'est pas le cas en VBA.
0
Rejoignez-nous