ListView et Slider pour scroll

kabeydia Messages postés 5 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 24 avril 2004 - 13 nov. 2003 à 00:33
kabeydia Messages postés 5 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 24 avril 2004 - 13 nov. 2003 à 21:49
Salut !

Je suis en train de faire un petit lecteur mp3 et j'ai besoin d'aide pour gérer la playlist.
En fait, j'utilise une ListView pour afficher l'auteur, le titre et le temps total. A côté j'utilise un control Slider personnalisable (avec images de fond etc...), mais qui a les mêmes propriétés que le Slider de base Microsoft, pour avoir une jolie scrollbar au lieu d'un vilain truc gris.

Mon problème: Comment faire défiler la liste avec un slider ?
J'ai déjà tout essayé (notamment avec 'EnsureVisible') mais il ne m'affiche que le dernier de la liste (par conséquent, le 5ème) mais je n'arrive pas à revenir au premier.
Ma liste est composée de 4 lignes max et à la propriété FlatScrollBar à True (pour éviter que les scrolls tout moches apparaissent !).

Voici mon code:

'Empêche de remonter juqu'en haut pour respecter les proportionnalités du slider en fonction du remplissage de la listview

Private Sub sldScroll_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If sldScroll.Value < 4 * 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 4 * 100 / lstvListe.ListItems.Count
    End If
End Sub

Private Sub sldScroll_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If sldScroll.Value < 4 * 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 4 * 100 / lstvListe.ListItems.Count
    End If
End Sub

'Click sur l'ascenceur de la liste

Private Sub sldScroll_Click()
    
    Dim nSnap As Integer   'Snap clické
    Dim nMultip As Integer  'Multiplicateur entre le scroll et la liste
    Dim nEnsure As Integer  'Index de la musique à afficher
    
    If sldScroll.Value < 4 * 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 4 * 100 / lstvListe.ListItems.Count
    End If
    
    nSnap = 4 * 100 / lstvListe.ListItems.Count
    nMultip = nSnap / 4
    nEnsure = sldScroll.Value / nMultip
    
    lstvListe.ListItems(nEnsure).EnsureVisible

End Sub


Vala ! J'espère que quelqu'un aura une solution miracle !

Merci d'avance

Kabeydia

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
13 nov. 2003 à 09:22
Utiliser EnsureVisible n'est pas une méthode performante. En effet, tu appliques cette methode sur un Item que tu desires voir. Ca ne fait donc pas un deplacement fluide....

pour faire ce que tu veux, il te faut faire avec des API.....

j'ai beau tenter....
je ne parviens qu'a faire bouger le ScrollBar.... mais la liste n'est pas mise a jour....
Il doit pourtant bien exister un moyen.....

au pire, tu pourrais utiliser une ListBox, celle-ci possede en effet la propriete TopIndex....




By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
kabeydia Messages postés 5 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 24 avril 2004 1
13 nov. 2003 à 18:31
Idée à réfléchir...
Mais le problème des listboxes c'est qu'il n'y a qu'une seule colonne ! :(

Je ne suis encore une bête en vb mais comment on utilise les API ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 nov. 2003 à 20:18
Il faut declarer l'API en question.

ensuite, tu agis avec comme avec toute fonction.....

exemple :
Private Declare Function Chord Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long, ByVal X4 As Long, ByVal Y4 As Long) As Long

Private Sub Form_Click()
    Chord Me.hdc, 10, 10, 100, 100, 40, 60, 60, 40
End Sub


tu trouvera surement des tas d'informations sur le Net, sur les API.

pour les ListBoxes, tu peux toujours afficher plusieurs colonnes, en separant les champs par des tabulations.

une API te permet de les aligner, comme dans Word.....

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const LB_SETTABSTOPS As Long = &H192

Private Sub Form_Load()
    '# On definit le nombre de caracteres pour chacun des TabStops
    Dim TabStop(3) As Long
    TabStop(0) = 2&
    TabStop(1) = 120&
    TabStop(2) = 200&
    '# Essaie de mettre la ligne suivante en commentaire, tu y verras une difference !!
    SendMessage List1.hwnd, LB_SETTABSTOPS, 3&, TabStop(0)

    Dim a As Byte
    For a = 0 To 254
        List1.AddItem "Item Court " & a & Chr$(9) & "SubItem " & a & Chr$(9) & "SubItem2"
        List1.AddItem "Item Long XxXxXxXxXxX " & a & Chr$(9) & "SubItem " & a & Chr$(9) & "SubItem2"
    Next a
End Sub


By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
kabeydia Messages postés 5 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 24 avril 2004 1
13 nov. 2003 à 21:11
Ouf ! Je n'ai même pas eu le temps de regarder ta réponse !
Après une longue réflexion, j'ai trouvé un truc qui marche (sans API).
En fait, il faut ne pas définir de Snap (espacements dans la scroll quand on clique) et mettre ce code:

'Click bas sur l'ascenceur de la liste

Private Sub sldScroll_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If sldScroll.Value < 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 100 / lstvListe.ListItems.Count
    End If
End Sub

'Mouvement sur l'ascenceur de la liste

Private Sub sldScroll_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    Dim dScroll As Double   'Valeur d'une ligne par rapport au scroll
    Dim dQuatre As Double   'Valeur de 4 lignes à afficher
    Dim nEnsure As Integer  'Index de la musique à afficher
    Dim nI As Integer       'Variable de boucle
    
    If sldScroll.Value < 4 * 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 4 * 100 / lstvListe.ListItems.Count
    End If
    
    dScroll = 100 / lstvListe.ListItems.Count
    dQuatre = sldScroll.Value / dScroll
    nEnsure = dQuatre - 3
    
    For nI = nEnsure To nEnsure + 3
        lstvListe.ListItems(nI).EnsureVisible
    Next nI
    
End Sub

'Click haut sur l'ascenceur de la liste

Private Sub sldScroll_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    Dim dScroll As Double   'Valeur d'une ligne par rapport au scroll
    Dim dQuatre As Double   'Valeur de 4 lignes à afficher
    Dim nEnsure As Integer  'Index de la musique à afficher
    Dim nI As Integer       'Variable de boucle
    
    If sldScroll.Value < 4 * 100 / lstvListe.ListItems.Count Then
        sldScroll.Value = 4 * 100 / lstvListe.ListItems.Count
    End If
    
    dScroll = 100 / lstvListe.ListItems.Count
    dQuatre = sldScroll.Value / dScroll
    nEnsure = dQuatre - 3
    
    For nI = nEnsure To nEnsure + 3
        lstvListe.ListItems(nI).EnsureVisible
    Next nI
    
End Sub


En fait, c'était tout con... mais il fallait y penser !

Merci quand même pour ton aide précieuse :)

Kab
0

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

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 nov. 2003 à 21:15
avec un ListBox, tu n'aurais pas non plus eu besoin d'API.

tu fait un Slider.max = List1.ListCount
et dans Slider1._Change, tu fais

List1.TopIndex = Slider1.Value

------------------------------------------------

sachant que ca fonctionne aussi avec le ListView, mais c'est pas pareil.....

tu fait un Slider.max = List1.ListItems.Count
et dans Slider1._Change, tu fais

Listview1(Slider1.Value).EnsureVisible

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
kabeydia Messages postés 5 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 24 avril 2004 1
13 nov. 2003 à 21:49
Ah ouaiis !! C'est un "petit peu" plus simple :)

En fait, je me prenais la tête avec des pourcentages car j'avais initialisé le max du scroll à 100....

Dans tous les cas, quand y faut se compliquer la vie, je suis la reine !

Merci :)

Kabeydia
0
Rejoignez-nous