Problem 2. Verschieben in _MoveLVItem()

  • 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
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 10
    $Item = GUICtrlCreateListViewItem("Eintrag " & $i, $ListView)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func raus()
    Exit
    EndFunc ;==>raus

    [/autoit] [autoit][/autoit] [autoit]

    ;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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

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

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (27. April 2011 um 14:34)

  • Also ich habe es grade mal ausprobiert und ein bisschen Debuggt, also er kommt mit den Indexzahlen durcheinander.

    Spoiler anzeigen
    [autoit]

    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(GUICtrlGetHandle($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(GUICtrlGetHandle($hLV), $ItemIndex + 1)
    _GUICtrlListView_EndUpdate($hLV)
    EndIf
    Return -1
    EndFunc ;==>_MoveLVItem

    [/autoit]

    Aus der Hilfe von _GuictrlListView_DeleteItem:

    Zitat

    Falls diese Funktion mit einem Listview, welches durch die Funktion GUICtrlCreateListView erstellt wurde, angewendet wird, muss der Befehl _GUICtrlListView_DeleteItem(GUICtrlGetHandle($ListView), iIndex) heißen, da sonst eine Fehlermeldung erscheint. ($ListView ist die Variable wie das Listview heißt)

    Damit geht es bei mir

  • Danke, das wars. Ich bin einfach nicht drauf gekommen.

    Nur ist mir dabei nicht erklärlich, warum _GUICtrlListView_InsertItem() funktioniert und _GUICtrlListView_DeleteItem() nicht ?
    Aber funktioniert ja nun.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"