loop in listbox



  • loop in listbox
    di marinoernestoch data: 29/01/2014 22:09:19

    Saluto tutti.
    Chi mi sa dire dove sbaglio?
    Ho una listbox che voglio gestire sia con i tasti su e giù che con il mouse (doppio click).
    Ho inserito il test: se sono all'inizio e premo freccia in su, ricomincio dalla file;
    se sono alla fine e premo freccia in giù, ricomincio dall'inizio.
    Altrimenti scorro in su e in giù a piacimento. L'errore è che se sono alla fine e premo freccia in giù, invece di posizionarsi sul primo in alto si posiziona sul secondo. Così se sono all'inizio e premo freccia in su, mi si posiziona al penultimo. Ho fatto qualche prova ma non ho capito dove sbaglio. Inoltre, durante le prove all'ultima posizione, a volte mi fa vedere la penultima. Se invece la scelgo, anche se vedo la penultima (nell'esempio 19), mi mette a disposizione l'ultima (20). La macro che attiva il form è CARICO_SI_LOOP. Un form identico, senza loop funziona.
    grazie



  • di scossa data: 29/01/2014 22:26:55

    Devi annullare il tasto premuto mettendo KeyCode = 0:
     
    Private Sub listbox_si_loop_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     Select Case KeyCode
     Case 38
       If ListBox_si_loop.ListIndex = 0 Then
         ListBox_si_loop.ListIndex = ListBox_si_loop.ListCount - 1  ' se al primo vai all'ultimo
         KeyCode = 0  '<-------- annullo il tasto premuto
       End If
     Case 40
       If ListBox_si_loop.ListIndex = ListBox_si_loop.ListCount - 1 Then
         ListBox_si_loop.ListIndex = 0                    'se all'ultimo vai al primo
         KeyCode = 0  '<-------- annullo il tasto premuto
       End If
      Case 27
         Unload Me
      Case 13
         Me.Hide
         
      Case Else
         MsgBox KeyCode
      End Select
    End Sub
    



  • di marinoernestoch data: 29/01/2014 22:43:36

    Grazie Scossa. Funziona. Ma perchè si deve azzerare il keycode?
    inoltre hai visto che rimane il difetto della visualizzazione: nel loop verso l'alto (la seconda volta) visualizza due volte il 2° e nel loop verso il basso (la seconda volta) visualizza due volte il 19°?



  • di scossa data: 29/01/2014 22:54:14

    cit.: "Ma perchè si deve azzerare il keycode?"
    perchè lo spostamento del item selezionato l'hai già fatto via codice con ListBox_si_loop.ListIndex = ....

    cit.: "inoltre hai visto che rimane il difetto della visualizzazione"

    sinceramente non riesco a riprodurlo, a me funziona regolarmente.
    Puoi descrivere i passi esatti per riprodurre l'anomalia?



  • di scossa data: 29/01/2014 22:54:59

    errata: del item
    corrige: dell'item



  • di marinoernestoch data: 29/01/2014 23:06:31

    1) Attivo il form (è posizionato sull'uno)
    2) freccia in su (si posiziona sul 20)
    3) ripeto 19 volte freccia in su (scorre regolarmente)
    4) freccia in su x la ventesima volta (vedo 2 volte il due= anomalia)

    5) freccia in giù si posiziona sul due e ora si vede anche l'uno


    analogamente
    1)freccia in giù fino ad arrivare alla ventesima
    2) freccia in giù, passa al primo
    3) ripeto 19 volte freccia in giù (scorre regolarmente)
    4) freccia in giù x la ventesima volta (vedo 2 volte il 19= anomalia)

    5) freccia in su una volta (si posiziona sul 19, ma fa vedere anche il 20).

    immagino sia solo un problema di visione, però è brutto.
    grazie Scossa



  • di scossa data: 29/01/2014 23:21:38

    Ok, ho visto.
    Ti consiglio due cose.
    La prima è di usra l'evento KeyUp() per fare un repaint della userform (vedi codice sotto); e già questo dovrebbe risolvere.

    La seconda è di spostare l'istruzione:
    Application.ScreenUpdating = True

    prima di
    SI_LOOP.Show

     
    Private Sub ListBox_si_loop_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      Me.Repaint
    End Sub
    



  • di marinoernestoch (utente non iscritto) data: 30/01/2014 12:15:48

    Ringrazio scossa della dritta. Con il me.repaint nell'evento keyUp funziona. chiudo la discussione.
    Ho già pronto un altro quesito. by