Drag And Drop - přetahování mezi ListBoxy

Jedním z nejběžnějších scénářů, kde jsou operace Drag And Drop očekávány (a také vysoce hodnoceny), zahrnují přesouvání položek z jednoho ListBoxu do druhého. Typicky jsou k dispozici i tlačítka, ale ty potřebují dvě kliknutí myši (výběr položky a kliknutí na tlačítko). Mnohem efektivnější je využití metod Drag And Drop, protože vyžaduje pouze jednoduchý pohyb myší (výběr a tažení).

Pro následující příklad vložte na formulář dva ListBoxy a nastavte vlastnost OLEDropMode na 1-Manual. Přidejte následující kód:

Private Sub Form_Load()

    ' Naplnění jednoho ListBoxu
    List1.AddItem "Jedna"
    List1.AddItem "Dva"
    List1.AddItem "Tři"
    List1.AddItem "Čtyři"
    List1.AddItem "Pět"

End Sub 

Private Sub List1_MouseDown(Button As Integer, Shift As Integer, _
    X As Single, Y As Single)

    List1.OLEDrag   
' Začátek přetahování

End Sub

Private Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)

    ' Povolen pouze přesun
    AllowedEffects = vbDropEffectMove
    ' Přiřazení výběru v ListBoxu do DataObject
    Data.SetData List1

End Sub

Private Sub List2_OLEDragDrop(Data As DataObject, Effect As Long, _
    Button As Integer, Shift As Integer, X As Single, Y As Single)

    Dim strList As String
    ' Test formátu dat v DataObject
    If Not Data.GetFormat(vbCFText) Then Exit Sub
    ' Získání textu z  DataObject
    strList = Data.GetData(vbCFText)
    List2.AddItem strList

End Sub

Private Sub List1_OLECompleteDrag(Effect As Long)

    ' Odebrání položky z ListBoxu
    List1.RemoveItem List1.ListIndex

End Sub

V události OLEStartDrag jsme přiřadili vybranou položku ve zdrojovém ListBoxu do DataObject. Nepotřebujeme specifikovat formát, DataObject sám rozpozná text. V události OLEDragDrop cílového ListBoxu je použita metoda GetFormat pro DataObject, abychom se ujistili, že DataObject obsahuje text - pokud bychom se pokoušeli přetáhnout jiný typ dat, tak by to mohlo celé padnout. vbCFText je konstanta z kolekce ClipBoardConstants.

Jistě jste si všimli, že výstup z metody GetData jsme přiřadili do proměnné typu String. Je to z toho důvodu, že přidávání položek do ListBoxu se děje pomocí metody AddItem. Pro TextBox by mohl být výstup přiřazen přímo:

Text1.Text = Data.GetData(vbCFText)

Techniky, použité v tomto příkladě budou pracovat tam, kde potřebujete přetahovat text - mezi prvky a formuláři, mezi formuláři nebo mezi Vaší aplikací a jinými aplikacemi, jako je například Microsoft Word, pokud podporují techniky Drag And Drop.

Zpět Další

Autor: The Bozena