J'aimerais savoir comment récupère-t-on l'action du clic (pas un simple clic) lorsque l'on appuie sur le scroll (la flèche) du bas ou du haut de la listbox
J'aimerais sélectionner automatiquement la sélection suivante si j'appuie bas et sélection précédente si j'appuie haut
exemple:
3 valeurs ds la liste box
value1
value2
value3
par defaut la value1 est activé, si j'appuie sur le scroll du bas alors je sélectionne value2, ensuite si j'appuie sur le scroll haut alors je resélection value1...
Tu verras avec ce code que l'objet ListBox ne peut pas gérer ce que tu demandes.
Dim last_list1_topIndex As Long
Private Sub Form_Load()
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
last_list1_topIndex = 0
End Sub
Private Sub List1_Scroll()
MsgBox "je scrolle"
If List1.TopIndex < last_list1_topIndex Then
List1.ListIndex = List1.ListIndex - 1
Else
List1.ListIndex = List1.ListIndex + 1
End If
last_list1_topIndex = List1.TopIndex
End Sub
D'une part, il faut qu'il y ait suffisamment d'éléments dans la ListBox pour faire apparaître une scrollBar, d'autre part, si la barre de défilement ne bouge bas, l'evénement Scroll n'existe plus. Tu limites donc considérablement ton déplacement dans la liste.
Par contre, ce que tu peux faire, c'est ajouter une vScrollBar à côté de ta listBox
Tu places ta ListBox dans une Frame, borderStyle = 0 (None)
Tu t'arranges pour que la Frame soit moins large que la listBox, ce qui permet de cacher la scrollBar de la listBox.
Juste à côté de la frame, tu places une ScrollBar (Microsoft Form 2.0 dans Projets/Composants), de façon à avoir l'illusion que ta nouvelle scrollBar est celle de la listbox.
Puis tu tapes ce code :
Private Sub Form_Load()
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
List1.AddItem "toto"
List1.AddItem "titi"
List1.AddItem "tata"
ScrollBar1.Min = 0
ScrollBar1.Max = List1.ListCount - 1
List1.ListIndex = 0
End Sub
Private Sub ScrollBar1_Change()
List1.ListIndex = ScrollBar1.Value
End Sub
Manu -------------------------------------------
Une question bien posée, c'est une chance de réponse bien adaptée.
Private Sub List1_Scroll()
MsgBox "je scrolle"
If List1.TopIndex < last_list1_topIndex Then
List1.ListIndex = List1.ListIndex - 1
Else
List1.ListIndex = List1.ListIndex + 1
End If
last_list1_topIndex = List1.TopIndex
End Sub
Fait plutôt :
Private Sub List1_Scroll()
MsgBox "je scrolle"
If List1.TopIndex < last_list1_topIndex Then
List1.ListIndex = List1.ListIndex - last_list1_topIndex - List1.TopIndex
Else
List1.ListIndex = List1.ListIndex + last_list1_topIndex - List1.TopIndex
End If
last_list1_topIndex = List1.TopIndex
End Sub
_______________________________________
je ne connais pas trop ce genre de contrôle mais je suppose qu'il y a au moins l'évènement OnChange ou Change.
> à l'init tu récupère la valeur par défaut dans une global ou une static, sur le Change, tu compare la valeur actuelle avec ta sauvegarde et tu sauras si t'as eu un + ou un -.
Tu fais ton traitement, et tu mets à jour ta globale avec la nouvelle valeur.
Un moyen simple de contourner les éventuelles lacunes ...
Tu peux te baser sur la propriété TopIndex qui te donne l'index de l'élément se trouvant en haut de liste : s'il a été modifié, c'est que l'utilisateur a utilisé le scrollbar, ou la molette de la souris....
_______________________________________
Je me répette, je sais, mais évitez d'utiliser les Microsoft Forms 2 : il s'agit d'un activeX développé par Microsoft pour Office qui ne peut pas être déployé avec l'application (on n'en a pas le droit). Donc si tu l'utilise, tu ne pourras pas vendre, ou même créer de setup de ton programme sans être sûr que les clients ont office d'installé !
_______________________________________
je viens d'essayer la dernière solution de DARKSIDIOUS
en rajoutant une ligne pour la sélection auto
Private Sub List1_Scroll()
dim last_list1_topIndex as integer
If List1.TopIndex < last_list1_topIndex Then
List1.ListIndex = List1.ListIndex - last_list1_topIndex - List1.TopIndex
Else
List1.ListIndex = List1.ListIndex + last_list1_topIndex - List1.TopIndex
End If
last_list1_topIndex = List1.TopIndex
list1.ListIndex= list1.TopIndex
End Sub
j'ai aussi déclaré last_list1_topIndex
public last_list1_topIndex as integer
car je récupère la valeur chargé au formulaire (qui n'est pas toujours 0 ;))
List1.ListIndex=varmemoriser
last_list1_topIndex=List1.ListIndex
Private Sub List1_Scroll()
STATIC last_list1_topIndex as integer
If List1.TopIndex < last_list1_topIndex Then
List1.ListIndex = List1.ListIndex - last_list1_topIndex - List1.TopIndex
Else
List1.ListIndex = List1.ListIndex + last_list1_topIndex - List1.TopIndex
End If
last_list1_topIndex = List1.TopIndex
list1.ListIndex= list1.TopIndex
End Sub
Car sans le "static", ta variable perd sa valeur à chaque fois !
_______________________________________