- Offizieller Beitrag
_MoveLVItem($ItemIndex, $StepWidth, $hLV)
Der per $ItemIndex angegebene Eintrag eines ListView wird um die in $StepWidth angegebene Anzahl (und Richtung, '-' nach oben) verschoben.
Edit:
Hab jetzt mal noch eine ergänzende Funktion für das Verschieben markierter Elemente hinzugefügt (die obige Funktion verwendet).
An der Funktion hab ich noch einen Bug gefixt - Verschieben mit positiver Zahl war fehlerhaft.
_MoveAndMarkLVItem($hLV, $hGUI, $Skip)
Hier in einem Bsp.
Spoiler anzeigen
#include <GUIConstants.au3>
#Include <GuiListView.au3>
Opt("GUIOnEventMode", 1)
Dim $arItem[8]
$AForm1 = GUICreate("AForm1", 633, 454, 193, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$ListView1 = GUICtrlCreateListView("Spalte1|Spalte2|Spalte3", 76, 76, 429, 221, BitOR _
($LVS_REPORT,$LVS_SHOWSELALWAYS), BitOR($WS_EX_CLIENTEDGE,$LVS_EX_GRIDLINES, _
$LVS_EX_FULLROWSELECT))
GUICtrlSendMsg(-1, 0x101E, 0, 80)
GUICtrlSendMsg(-1, 0x101E, 1, 80)
GUICtrlSendMsg(-1, 0x101E, 2, 80)
For $i = 0 To 7
$arItem[$i] = GUICtrlCreateListViewItem('Zeile ' & $i & '- 1' & '| - 2 | - 3', $ListView1)
Next
$Button1 = GUICtrlCreateButton("Move With Selection", 388, 340, 121, 29, 0)
GUICtrlSetOnEvent(-1, "Button1Click")
GUICtrlCreateLabel('Anzahl Zeilen und Richtung ("-" ist Auf) ', 140, 345, 200)
$count = GUICtrlCreateInput('-1', 340, 343, 30)
GUISetState(@SW_SHOW)
While 1
Sleep(100)
WEnd
Func AForm1Close()
Exit
EndFunc
Func Button1Click()
_MoveAndMarkLVItem($ListView1, $AForm1, GUICtrlRead($count) )
Switch @error
Case 1
MsgBox(0, 'Fehler', 'GUI oder ListView nicht vorhanden')
Case 2
MsgBox(0, 'Fehler', 'Schrittgröße oder Richtung falsch')
EndSwitch
EndFunc
;----------------------------------------------------------------------------------------------------------------------
; Funktion _MoveAndMarkLVItem($hLV, $hGUI, $Skip)
;
; Beschreibung verschiebt alle markierten Einträge eines ListViewCtrl um eine Anzahl Positionen
;
; Parameter $hLV: ListView ID
; $hGUI: GUI ID
; $Skip: Anzahl Zeilen um die die Einträge verschoben werden (negative Zahl - aufwärts)
;
; Return Erfolg: -1
; Fehler: 0 SetError 1 - GUI oder ListView nicht vorhanden
; 2 - Skip verweist auf Bereich außerhalb des ListViewIndex
;
; Erfordernisse #include <GuiListView.au3>
;
; Autor BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _MoveAndMarkLVItem($hLV, $hGUI, $Skip)
If (Not WinExists($hGUI)) Or (ControlGetHandle($hGUI, '', $hLV) = '') Then
SetError(1)
Return 0
EndIf
Local $arSelItems = _GUICtrlListViewGetSelectedIndices($hLV, 1)
If $Skip < 0 Then
For $i = 1 To $arSelItems[0]
_MoveLVItem($arSelItems[$i], $Skip, $hLV)
If @error Then
SetError(2)
Return 0
EndIf
Next
Else
For $i = $arSelItems[0] To 1 Step -1
_MoveLVItem($arSelItems[$i], $Skip, $hLV)
If @error Then
SetError(2)
Return 0
EndIf
Next
EndIf
GUISetState(@SW_LOCK, $hGUI)
ControlClick($hGUI, '', $hLV)
$idx = _GUICtrlListViewGetSelectedIndices($hLV, 0)
Send("{UP " & $idx & "}") ; Auf Listenanfang
For $i = 1 To $arSelItems[0]
If $i = 1 Then
If $arSelItems[$i]+$Skip > 0 Then
Send("{DOWN " & $arSelItems[$i]+$Skip & "}")
EndIf
Else
Send("^{DOWN " & $arSelItems[$i]-$arSelItems[$i-1] & "}")
Send("^{SPACE}")
EndIf
Next
GUISetState(@SW_UNLOCK, $hGUI)
Return -1
EndFunc ;==>_MoveAndMarkLVItem
;----------------------------------------------------------------------------------------------------------------------
; 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) > _GUICtrlListViewGetItemCount($hLV)-1 Then
SetError(1)
Return 0
EndIf
Local $txt2skip = _GUICtrlListViewGetItemText($hLV, $ItemIndex)
If $StepWidth < 0 Then
_GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth, $txt2skip)
_GUICtrlListViewDeleteItem($hLV, $ItemIndex+1)
Else
_GUICtrlListViewInsertItem($hLV, $ItemIndex + $StepWidth+1, $txt2skip)
_GUICtrlListViewDeleteItem($hLV, $ItemIndex)
EndIf
Return -1
EndFunc ;==>_MoveLVItem
Ach, das ist ja mein Post Nr: :kette: 1 0 0 0