|
Das Verschieben eines Elements in einer ListBox oder einer
ComboBox an eine andere Position ist nicht ganz trivial. Zum einen
muss berücksichtigt werden, dass sich der Ziel-Index geändert hat,
wenn das zu verschiebende Element vor oder (zufällig bereits) an
der gewünschten Ziel-Position steht und zum Verschieben
vorübergehend aus der Liste entfernt wird. Zum anderen sollte auch
der Inhalt der ItemData-Eigenschaft für das Element beim
Verschieben nicht verloren gehen. Außerdem sollte auch noch
definierbar sein, auf welches Element nach dem Verschieben der
ListIndex zeigt.
Die beiden Funktionen MoveListBoxItem und MoveComboBoxItem sorgen
für ein korrektes Verschieben des im Parameter Index1 angegebenen
Elements an die im Parameter Index2 angegebene Index-Position. Sind
zufällig Index1 und Index2 gleich oder ist Index2 nur um 1
größer als Index1, geschieht nichts - es ist sinnlos, ein Element
an die gleiche Position oder vor sich selbst schieben zu wollen. Um
ein Element ans Ende der Liste zu schieben, übergeben Sie in Index2
den Wert -1.
Im optionalen Parameter SelectMode legen Sie fest, ob der
ListIndex auf das Element, das sich nach dem Verschieben an der
Ausgangsposition befindet oder auf das verschobene Element zeigen
soll, oder ob der ListIndex gelöscht werden (= -1)
oder unverändert bleiben soll.
Der Rückgabewert der Funktionen enthält die tatsächliche neue
Position des verschobenen Elements.
Public Enum MoveSelectConstants
mvSelectDefault
mvSelectNone
mvSelectInserted
mvSelectStart
End Enum
Public Function MoveListBoxItem(ListBox As ListBox, _
ByVal Index1 As Long, ByVal Index2 As Long, _
Optional ByVal SelectMode As MoveSelectConstants = mvSelectInserted) _
As Long
Dim nItemData As Long
Dim nItem As String
If Index1 >= 0 Then
With ListBox
nItemData = .ItemData(Index1)
nItem = .List(Index1)
Select Case Index2
Case -1
.RemoveItem Index1
.AddItem nItem
Case 0 To .ListCount - 1
Select Case Index1
Case Index2, Index2 - 1
Exit Function
Case Is < Index2
.RemoveItem Index1
.AddItem nItem, Index2 - 1
Case Is > Index2
.RemoveItem Index1
.AddItem nItem, Index2
End Select
Case Else
MoveListBoxItem = -1
Exit Function
End Select
.ItemData(.NewIndex) = nItemData
Select Case SelectMode
Case mvSelectNone
.ListIndex = -1
Case mvSelectInserted
.ListIndex = .NewIndex
Case mvSelectStart
.ListIndex = Index1
End Select
MoveListBoxItem = .NewIndex
End With
End If
End Function
Public Function MoveComboBoxItem(ComboBox As ComboBox, _
ByVal Index1 As Long, ByVal Index2 As Long, _
Optional ByVal SelectMode As MoveSelectConstants = mvSelectInserted) _
As Long
Dim nItemData As Long
Dim nItem As String
If Index1 >= 0 Then
With ComboBox
nItemData = .ItemData(Index1)
nItem = .List(Index1)
Select Case Index2
Case -1
.RemoveItem Index1
.AddItem nItem
Case 0 To .ListCount - 1
Select Case Index1
Case Index2, Index2 - 1
Exit Function
Case Is < Index2
.RemoveItem Index1
.AddItem nItem, Index2 - 1
Case Is > Index2
.RemoveItem Index1
.AddItem nItem, Index2
End Select
Case Else
MoveComboBoxItem = -1
Exit Function
End Select
.ItemData(.NewIndex) = nItemData
Select Case SelectMode
Case mvSelectNone
.ListIndex = -1
Case mvSelectInserted
.ListIndex = .NewIndex
Case mvSelectStart
.ListIndex = Index1
End Select
MoveComboBoxItem = .NewIndex
End With
End If
End Function
 |
Mit den Funktionen MoveListBoxItem und
MoveComboBoxItem verschieben Sie problemlos ein Listen-Element
an eine beliebige andere Position in der Liste

|

|