Ich habe eine alte Funktion von bugfix und AspirinJunkie aufgegriffen und an die aktuelle Autoit-Version angepasst.
Beim Testen bin ich auf folgenden Fehler gestoßen, den ich beim besten Willen nicht lokalisieren kann:
Verschiebe ich per Drag'n Drop ein LV-Item so funktioniert das einwandfrei. Fasse ich das bereits einmal verschobene Item erneut an, wird es zwar am neuen Ziel eingefügt, aber das Item an der alten Position nicht entfernt, so das ich jedesmal ein LV-Element mehr erhalte.
Hat jemand eine Idee ?
Hier das Beispiel und die Funktion:
Spoiler anzeigen
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate("Test-GUI", 500, 300, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent($GUI_EVENT_CLOSE, "raus")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_MoveListViewItem")
$ListView = GUICtrlCreateListView("Eintrag", 10, 10, 480, 280)
_GUICtrlListView_SetColumnWidth($ListView, 0, 475)
For $i = 1 To 10
$Item = GUICtrlCreateListViewItem("Eintrag " & $i, $ListView)
Next
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func raus()
Exit
EndFunc ;==>raus
;Function by [email='AspirinJunkie@german-nlite.de'][/email] (benötigt globale Variable $ListView)
Func _MoveListViewItem()
Local $von, $bis
Local $down = GUIGetCursorInfo($GUI)
If $down[4] = $ListView Then
$von = _GUICtrlListView_GetHotItem($ListView)
While $down[2]
$down = GUIGetCursorInfo($GUI)
Sleep(50)
WEnd
If $down[4] = $ListView Then
$bis = _GUICtrlListView_GetHotItem($ListView)
If Not ($von = $bis) Then
_MoveLVItem($von, $bis - $von, $ListView)
_GUICtrlListView_SetItemSelected($ListView, $bis, 1, 1)
EndIf
EndIf
EndIf
EndFunc ;==>_MoveListViewItem
;----------------------------------------------------------------------------------------------------------------------
; Funktion _MoveLVItem($ItemIndex, $StepWidth, $hLV)
;
; Beschreibung verschiebt per Index angegebenen Eintrag eines ListViewCtrl um eine Anzahl Positionen
;
; Parameter $ItemIndex: Index der Zeile
; $StepWidth: Anzahl Zeilen um die der Eintrag verschoben wird (negative Zahl - aufwärts)
; $hLV: ListView ID
;
; Erfordernisse #include <GuiListView.au3>
;
; Autor BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
#include <GuiListView.au3>
Func _MoveLVItem($ItemIndex, $StepWidth, $hLV)
If ($ItemIndex + $StepWidth) < 0 Or _
($ItemIndex + $StepWidth) > _GUICtrlListView_GetItemCount($hLV) - 1 Then
SetError(1)
Return 0
EndIf
Local $txt2skip = _GUICtrlListView_GetItemText($hLV, $ItemIndex)
If $StepWidth > 0 Then
_GUICtrlListView_BeginUpdate($hLV)
_GUICtrlListView_InsertItem($hLV, $txt2skip, $ItemIndex + $StepWidth + 1)
;msgbox(0,">0",$ItemIndex)
;msgbox(0,"",_GUICtrlListView_GetItemText($hLV, $ItemIndex))
_GUICtrlListView_DeleteItem($hLV, $ItemIndex)
_GUICtrlListView_EndUpdate($hLV)
Else
_GUICtrlListView_BeginUpdate($hLV)
_GUICtrlListView_InsertItem($hLV, $txt2skip, $ItemIndex + $StepWidth)
;msgbox(0,"<=0",$ItemIndex & " +1")
;msgbox(0,"",_GUICtrlListView_GetItemText($hLV, $ItemIndex + 1))
_GUICtrlListView_DeleteItem($hLV, $ItemIndex + 1)
_GUICtrlListView_EndUpdate($hLV)
EndIf
Return -1
EndFunc ;==>_MoveLVItem