Rubrik: Controls · ListBox | VB-Versionen: VB5, VB6 | 24.05.06 |
Drag & Drop im ListBox-Control Hier ein Beispiel, wie man Einträge innerhalb einer ListBox via Drag & Drop verschieben kann. | ||
Autor: Dieter Otter | Bewertung: | Views: 13.857 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Nachfolgend ein Beispiel, wie man einzelne Einträge innerhalb der VB Standard-ListBox via Drag & Drop verschieben kann.
Benötigt wird eine Form mit einem ListBox-Control (List1) und nachfolgender Code:
Option Explicit ' Benötigte API-Deklaration 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_ITEMFROMPOINT = &H1A9 Dim nDragIndex As Long
Private Sub Form_Load() Dim i As Long With List1 ' Liste mit Test-Werten füllen For i = 1 To 100 List1.AddItem "Eintrag " & CStr(i) Next i ' OLE Drag/DropMode - Eigenschaften festlegen .OLEDragMode = 1 .OLEDropMode = 1 End With nDragIndex = -1 End Sub
Private Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long) ' ListIndex merken nDragIndex = List1.ListIndex End Sub
Private Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, _ Shift As Integer, X As Single, Y As Single) Dim sTemp As String If Data.GetFormat(vbCFText) And nDragIndex >= 0 Then ' Inhalt des selektierten Eintrags auslesen sTemp = Data.GetData(vbCFText) ' Element ermitteln, über dem sich der Mauszeiger aktuell befindet Dim nXPoint As Long Dim nYPoint As Long Dim nIndex As Long ' Umrechnen der Mauskoordinaten in Pixel nXPoint = CLng(X / Screen.TwipsPerPixelX) nYPoint = CLng(Y / Screen.TwipsPerPixelY) With List1 ' ListIndex anhand Mausposition ermitteln nIndex = SendMessage(.hwnd, LB_ITEMFROMPOINT, 0, ByVal ((nYPoint * 65536) + nXPoint)) If (nIndex >= 0) And (nIndex <= .ListCount) Then ' Selektierten Eintrag löschen List1.RemoveItem nDragIndex ' Selektiertes Element an die aktuelle Position verschieben List1.AddItem sTemp, nIndex End If End With End If End Sub
Private Sub List1_OLECompleteDrag(Effect As Long) ' gemerkten Index zurücksetzen nDragIndex = -1 End Sub