Domanda Spiegazione eventi e funzioni Drag and Drop Listview

bekkino92

Utente abituale
1 Novembre 2018
168
18
Excel 2016
2
Buonasera a tutti,
vorrei un aiuto da parte dei più esperti con qualche spiegazione o indicazioni su dove trovare il materiale per gli eventi Drag and Drop nelle Listview delle Userform.

Ho 2 Listview in una stessa Userform. Dalla prima devo passare gli elementi nella seconda e viceversa.
Nella seconda vorrei anche poterli riordinare a piacere
Mentre nella prima non mi interessa l'ordine, nella seconda l'ordine è fondamentale.
Ho preso spunto dalla funzione "Personalizza Barra Multifunzione" di Excel e ho messo i pulsanti aggiungi e rimuovi per spostare gli elementi da una parte all'altra, mentre a destra della seconda ho messo uno Spinbutton per cambiare la posizione e l'ordine degli elementi.
Questa soluzione funziona già benissimo, ma già che ci sto vorrei studiarmi il Drag and Drop, sia tra gli elementi della stessa Listview, per riordinarli, sia tra le 2 diverse per spostarli manualmente.

Per il momento ho visto che questa impostazione di proprietà
Visual Basic:
listview.OLEDragMode = ccOLEDragAutomatic
consente di avviare lo spostamento di un elemento (appare il + accanto al cursore)

Quest'altro proprietà invece
Visual Basic:
listview.OLEDropMode = ccOLEDropManual
consente di rilasciare l'oggetto all'interno della Listview, perchè impostandolo diversamente fa comparire il segnale di divieto nello spostamento di oggetti al suo interno.

A questo punto credo si debba intervenire sugli eventi o sull'altra proprietà
Visual Basic:
listview.OLEDrag
ma non sono riuscito a trovare su che valori bisogna impostarlo o a cosa effettivamente serva.

Anche per quanto riguarda gli eventi, ho trovato in rete qualche spiegazione ma poco chiara, e la maggior parte sconsigliava vivamente di usare il Drag and Drop su VBA, in quanto mal supportato.

Ho quindi fatto delle prove con gli eventi e visto quando si attivano.
Questo evento parte quando si inizia il trascinamento. Le righe commentate sotto il mio commento sono il codice che ho trovato in rete per una procedura simile.
Visual Basic:
Private Sub ListView1_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
    Debug.Print "OLEStartDrag Lv1"
    
    'RIGA TROVATA IN RETE, MA NON CAPISCO A COSA SERVE Nè COS'è vbCFText 
     'Data.SetData ListView1.SelectedItem.Text, vbCFText
End Sub
Questo invece parte quando il cursore arriva sulla seconda listview, prima di rilasciare il mouse
Visual Basic:
Private Sub ListView2_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
     Debug.Print "OLEDragOver Lv2"
    Set ListView2.DropHighlight= ListView2.ListItems(3)

    '4 RIGHE TROVATE IN RETE, CREDO SERVANO PER EVIDENZIARE L'ELEMENTO
     'Set ListView2.DropHighlight = ListView2.HitTest(x, y)
     'If ListView2.DropHighlight Is Nothing Then
      'Set ListView2.DropHighlight = ListView2.ListItems(ListView2.ListItems.Count)
     'End If
End Sub
Le 4 righe commentate servono per evidenziare un elemento nella listview2. A quello che ho capito l'elemento corrispondente alle coordinate x e y, ma ho visto che restituisce sempre il primo elemento. Io ho fatto la prova con l'elemento 3 ed effettivamente lo seleziona quando arrivo lì.

Poi, quando lascio il mouse, parte questo evento.
Visual Basic:
Private Sub ListView2_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
     Debug.Print "OLEDragDrop Lv2"
 
     With ListView2
        .ListItems.Add , , ListView2.ListItems.Count + 1
        .ListItems(ListView2.ListItems.Count).ListSubItems.Add , , ListView1.SelectedItem
     End With
     ListView1.ListItems.Remove ListView1.SelectedItem.Index
 
 'RIGHE TROVATE IN RETE
 'remove is optional
 'ListView1.ListItems.Remove ListView1.SelectedItem.Index
 'ListView2.ListItems.Add ListView2.DropHighlight.Index, , Data.GetData(vbCFText)
 'Set ListView2.DropHighlight = Nothing
End Sub
Anche questo, sistemato a modo mio completa lo spostamento dell'elemento. Le righe trovate in rete usavano invece Data.GetData(vbCFText).

Le domande che vorrei fare agli esperti, per capire qualcosa in più, sono queste, che sono in qualche modo collegate:
  1. Cos'è questo Data.GetData(vbCFText)? Io credo sia un modo per ottenere in forma testuale l'elemento, ma è una variabile che viene assegnata ogni volta che inizia un evento. Vedendo le variabili locali inoltre, risulta vuota anche all'inizio dell'evento OLEStartDrag, prima di essere definita. vbCFText poi mi restituisce un errore: dovrebbe essere un formato ma mi viene chiesto di dichiararlo.
  2. Che libreria è MSComctlLib.DataObject e perchè viene richiamata?
e questa:
  1. A che serve l'istruzione listview.OLEDrag? Avete manuali, link o spiegazioni per approfondire tutti questi eventi in VBA (variabili button, shift e altre richiamate che non ho compreso, e tutto il possibile materiale di studio)?
Vi metto il file con cui ho fatto le varie prove.
Spero di essere stato chiaro nella spiegazione delle richieste (alcune le ho cancellate perchè ho avuto l'illuminazione e risolto mentre scrivevo, quindi non so se si capisce ancora).
Mi piacerebbe un confronto con chi ha già esplorato tutte le funzioni
 

Allegati

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!