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.
|