Diverse Probleme mit ListView

  • Hallo zusammen,

    da ich immer mich weiter entwickeln will in AutoIt habe ich was mit ListView gemacht und habe jetzt ein paar Probleme, die ich nicht so auf die reihe bekomme und brauch deshalb eure Hilfe.

    hier erst mal der CODE

    Spoiler anzeigen

    [autoit#include <array.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ColorConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <SendMessage.au3>
    #include <Sound.au3>

    Global $aDropFiles[1]
    Global Const $VK_DELETE = 0x2E
    Global Const $AllesMarkieren = 0x41

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Liste Sortieren", 333, 437, -1, -1, BitOR($WS_MINIMIZEBOX,$WS_SYSMENU,$WS_POPUP,$WS_GROUP,$WS_CLIPSIBLINGS), $WS_EX_ACCEPTFILES)
    GUICtrlSetState($Form1, $GUI_DROPACCEPTED)
    GUISetOnEvent($GUI_EVENT_DROPPED, "_FilesDropped")
    $Pic1 = GUICtrlCreatePic("C:\Windows\Web\Screen\img103.jpg", 0, 0, 332, 436, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState($Pic1, $GUI_DISABLE)

    $ExitButton = GUICtrlCreateButton("Exit", 266, 8, 60, 25)
    $DateiLabel = GUICtrlCreateLabel("Keine Datei ausgewählt", 8, 40, 316, 40)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)

    Local $ListView = GUICtrlCreateListView("Nr|Titel|Status|Datei",8,85,316,343,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    ;~ $ListView = GUICtrlGetHandle($ListView)
    GUICtrlSetBkColor($ListView,0x1E1E1E)
    GUICtrlSetColor($ListView,0xffffff)
    GUICtrlSetState($ListView, BitOR($GUI_DROPACCEPTED,$GUI_FOCUS))
    _GUICtrlListView_SetBkImage($ListView,"C:\Windows\Web\Screen\img103.jpg")
    _GUICtrlListView_SetColumnWidth($ListView, 0, 40)
    _GUICtrlListView_SetColumnWidth($ListView, 1, 200)
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)

    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

    GUISetState(@SW_SHOW)

    For $i = 0 To 255
    _GUICtrlListView_AddItem($ListView, $i)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 2 Irgendetwas", 1,1)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 3", 2,2)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 4", 3,3)
    Next

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ExitButton
    Exit
    Case $GUI_EVENT_DROPPED
    If @GUI_DropId = $ListView Then GUICtrlSetData($ListView, @GUI_DragFile)
    _FilesDropped()
    EndSwitch
    WEnd

    Func _ListView_Sort($cIndex = 0)
    Local $iColumnsCount, $iDimension, $iItemsCount, $aItemsTemp, $aItemsText, $iCurPos, $iImgSummand, $i, $j

    $iColumnsCount = _GUICtrlListView_GetColumnCount($ListView)

    $iDimension = $iColumnsCount * 2

    $iItemsCount = _GUICtrlListView_GetItemCount($ListView)

    If $iItemsCount = 0 Then Return ConsoleWrite('Keine Dateien in Liste vorhanden' & @CR)

    Local $aItemsTemp[1][$iDimension]

    For $i = 0 To $iItemsCount - 1
    $aItemsTemp[0][0] += 1
    ReDim $aItemsTemp[$aItemsTemp[0][0] + 1][$iDimension]

    $aItemsText = _GUICtrlListView_GetItemTextArray($ListView, $i)
    $iImgSummand = $aItemsText[0] - 1

    For $j = 1 To $aItemsText[0]
    $aItemsTemp[$aItemsTemp[0][0]][$j - 1] = $aItemsText[$j]
    $aItemsTemp[$aItemsTemp[0][0]][$j + $iImgSummand] = _GUICtrlListView_GetItemImage($ListView, $i, $j - 1)
    Next
    Next

    $iCurPos = $aItemsTemp[1][$cIndex]
    _ArraySort($aItemsTemp, 0, 1, 0, $cIndex)
    If StringInStr($iCurPos, $aItemsTemp[1][$cIndex]) Then _ArraySort($aItemsTemp, 1, 1, 0, $cIndex)

    ConsoleWrite($iCurPos & ' ' & $aItemsTemp[1][$cIndex] & ' ' & $aItemsTemp & @CR)

    For $i = 1 To $aItemsTemp[0][0]
    For $j = 1 To $iColumnsCount
    _GUICtrlListView_SetItemText($ListView, $i - 1, $aItemsTemp[$i][$j - 1], $j - 1)
    _GUICtrlListView_SetItemImage($ListView, $i - 1, $aItemsTemp[$i][$j + $iImgSummand], $j - 1)
    Next
    Next
    EndFunc

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $ListView
    If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    Local $sDrive, $sDir, $sFilename, $sExtension
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    _GUICtrlListView_SetItemSelected($ListView, DllStructGetData($tInfo, "Index"),True,True)
    $lol = _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"),3)
    Local $aPathSplit = _PathSplit($lol, $sDrive, $sDir, $sFilename, $sExtension)
    If IsArray($aPathSplit) Then
    If FileExists($aPathSplit[0]) Then
    Local $hallo
    $hallo = MsgBox(4100, 'Datei', 'Datei: ' & $aPathSplit[0] & @CR & @CR & _
    'Laufwerk: ' & $aPathSplit[1] & @CR & @CR & _
    'Ordner: ' & $aPathSplit[2] & @CR & @CR & _
    'Dateiname: ' & $aPathSplit[3] & @CR & @CR & _
    'Dateiendung: ' & $aPathSplit[4] & @CR & @CR & @CR & @CR & _
    'Soll die Datei ausgewählt werden?')
    If $hallo = 6 Then GUICtrlSetData($DateiLabel, $aPathSplit[0])
    Else
    GUICtrlSetData($DateiLabel, _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"),1))
    EndIf
    EndIf
    Case $LVN_COLUMNCLICK
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $ColumnIndex = DllStructGetData($tInfo, "SubItem")
    _ListView_Sort($ColumnIndex)
    Case $LVN_KEYDOWN
    $taGLVKEYDOWN = DllStructCreate("int;int;int;int;uint", $ilParam)
    $code = Hex(DllStructGetData($taGLVKEYDOWN, 4), 2)
    Select
    Case $code = Hex($VK_DELETE, 2)
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    $Selected = StringSplit(_GUICtrlListView_GetSelectedIndices ($ListView), "|")
    If $Selected[0]=$id then
    _GUICtrlListView_DeleteAllItems($ListView)
    Else
    For $i=$Selected[0] To 1 Step -1 ; Loop through the array returned by StringSplit to display the individual values.
    _GUICtrlListView_DeleteItem ($ListView, $Selected[$i])
    Next
    EndIf
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To $id
    _GUICtrlListView_SetItem($ListView,$i+1,$i,0)
    Next
    _GUICtrlListView_EndUpdate($ListView)
    Case $code = Hex($AllesMarkieren, 2)
    Local $hDLL = DllOpen("user32.dll")
    If _IsPressed("11", $hDLL) Then
    ControlListView ( "", "", $ListView, "SelectAll")
    EndIf
    EndSelect
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    Func _FilesDropped()
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To UBound($aDropFiles) - 1
    $id = $id+1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    GUICtrlCreateListViewItem($id & "|" & $split[3] & $split[4] & "|" & "Bereit" & "|" & $split[0], $ListView)
    Next
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)
    _GUICtrlListView_EndUpdate($ListView)
    EndFunc ;==>_FilesDropped[/autoit]

    Bei folgenden Fehler brauche ich Hilfe:
    1. Wenn ich Dateien per Drag and Drop in die Liste hinzufüge, ersetzt es mir die Überschrift "Nr" in eine der Hinzugefügten Dateien. Was mach ich da falsch?
    2. Wenn ich oben auf die Überschriften klicke, kann ich die Liste sortieren. Leider sortiert es mir aber falsch. Wo ist da der Hacken?
    3. Man kann in der Liste Einträge löschen. Angenommen ich markiere von Zeile Nr. 5 bis zum Schluss alles so dass nur noch weniger Einträge in der Liste bleiben als das die voll ausgefällt wäre oder wenn ich unten alles markiere aber dann oben stehe und dann die markierten Einträge lösche, dann verschwindet die ListView komplett und wird erst wieder langsam sichtbar wenn ich über die übrigen Einträge mit der Maus drüber gehe oder klicke.
    Wie kann ich das beseitigen? Gibt es da eine Funktion die die Liste dann aktualisiert.
    4. Ist zwar kein Fehler, aber was mir noch fehlt ist wie kann ich es anstellen dass ich mit der Maus die einzelnen Positionen untereinander verschieben kann? Also sozusagen die Reihenfolge der Zeilen untereinander tauschen.

    Wenn ihr mir dabei helfen könntet, dann seid ihr die Besten der Besten von Allerbesten :D

    Danke schon mal vorab

    • Offizieller Beitrag

    Der 1 Fehler liegt an GUICtrlSetData($ListView, @GUI_DragFile), damit wird der Titel des Listviews gesetz.
    Btw ist das vollkommen Sinnfrei, da du ja die Func _FilesDropped aufrufst, die für das Einfügen des/der ListviewItem/s zuständig ist.

    Zu2: Das Problem liegt darim, das _ArraySort Zahlen nicht als solche behandelt es wird alleine nach dem Alphabet sortiert.
    Um z.B. das Index zu sortieren ist das ganze ganz einfach umzusetzen:

    [autoit]

    Func _ListView_Sort($cIndex = 0)
    Local $iColumnsCount, $iDimension, $iItemsCount, $aItemsTemp, $aItemsText, $iCurPos, $iImgSummand, $i, $j

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

    $iColumnsCount = _GUICtrlListView_GetColumnCount($ListView)

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

    $iDimension = $iColumnsCount * 2

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

    $iItemsCount = _GUICtrlListView_GetItemCount($ListView)

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

    If $iItemsCount = 0 Then Return ConsoleWrite('Keine Dateien in Liste vorhanden' & @CR)

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

    Local $aItemsTemp[1][$iDimension]

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

    For $i = 0 To $iItemsCount - 1
    $aItemsTemp[0][0] += 1
    ReDim $aItemsTemp[$aItemsTemp[0][0] + 1][$iDimension]

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

    $aItemsText = _GUICtrlListView_GetItemTextArray($ListView, $i)
    $iImgSummand = $aItemsText[0] - 1

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

    For $j = 1 To $aItemsText[0]
    If (StringIsFloat($aItemsText[$j]) Or StringIsInt($aItemsText[$j])) Then
    $aItemsText[$j] = Number($aItemsText[$j])
    EndIf
    $aItemsTemp[$aItemsTemp[0][0]][$j - 1] = $aItemsText[$j]
    $aItemsTemp[$aItemsTemp[0][0]][$j + $iImgSummand] = _GUICtrlListView_GetItemImage($ListView, $i, $j - 1)
    Next
    Next

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

    $iCurPos = $aItemsTemp[1][$cIndex]
    _ArraySort($aItemsTemp, 0, 1, 0, $cIndex)
    If StringInStr($iCurPos, $aItemsTemp[1][$cIndex]) Then _ArraySort($aItemsTemp, 1, 1, 0, $cIndex)

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

    ConsoleWrite($iCurPos & ' ' & $aItemsTemp[1][$cIndex] & ' ' & $aItemsTemp & @CR)

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

    For $i = 1 To $aItemsTemp[0][0]
    For $j = 1 To $iColumnsCount
    _GUICtrlListView_SetItemText($ListView, $i - 1, $aItemsTemp[$i][$j - 1], $j - 1)
    _GUICtrlListView_SetItemImage($ListView, $i - 1, $aItemsTemp[$i][$j + $iImgSummand], $j - 1)
    Next
    Next
    EndFunc ;==>_ListView_Sort

    [/autoit]


    Das ganze funzt dann bei allen Colums die nur aus Zahlen oder Floats bestehen. Bei den anderen Colums ist das schwiriger umzusetzen, aber ich denke du wirs seltener
    Spalten und Zeilennummer als Text verwenden und Dateinamen würden wieder richtig sortiert, genau wie Dateiendungen oder der Status


    Zu 3: Wie hast du das umgesetzt? Ich kann nicht in deinem Script dazu finden?

    Ich kann das beschriebene Verhalten auch nicht feststellen.

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 28.02.2015 17:45:10
    #EndRegion

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

    #include <array.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ColorConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <SendMessage.au3>
    #include <Sound.au3>

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

    Global $aDropFiles[1]
    Global Const $VK_DELETE = 0x2E
    Global Const $AllesMarkieren = 0x41

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

    $Form1 = GUICreate("Liste Sortieren", 333, 460, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_SYSMENU, $WS_POPUP, $WS_GROUP, $WS_CLIPSIBLINGS), $WS_EX_ACCEPTFILES)
    GUICtrlSetState($Form1, $GUI_DROPACCEPTED)
    GUISetOnEvent($GUI_EVENT_DROPPED, "_FilesDropped")
    $Pic1 = GUICtrlCreatePic("C:\Windows\Web\Screen\img103.jpg", 0, 0, 332, 436, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState($Pic1, $GUI_DISABLE)

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

    $ExitButton = GUICtrlCreateButton("Exit", 266, 8, 60, 25)
    $DateiLabel = GUICtrlCreateLabel("Keine Datei ausgewählt", 8, 40, 316, 40)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)
    $DelSelected = GUICtrlCreateButton("Delete selected", 10, 435,100, 25)

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

    Local $ListView = GUICtrlCreateListView("Nr|Titel|Status|Datei", 8, 85, 316, 343, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    ;~ $ListView = GUICtrlGetHandle($ListView)
    GUICtrlSetBkColor($ListView, 0x1E1E1E)
    GUICtrlSetColor($ListView, 0xffffff)
    GUICtrlSetState($ListView, BitOR($GUI_DROPACCEPTED, $GUI_FOCUS))
    _GUICtrlListView_SetBkImage($ListView, "C:\Windows\Web\Screen\img103.jpg")
    _GUICtrlListView_SetColumnWidth($ListView, 0, 40)
    _GUICtrlListView_SetColumnWidth($ListView, 1, 200)
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)

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

    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    GUISetState(@SW_SHOW)

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

    For $i = 0 To 255
    _GUICtrlListView_AddItem($ListView, $i)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 2 Irgendetwas", 1, 1)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 3", 2, 2)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 4", 3, 3)
    Next

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

    While Sleep(10)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ExitButton
    Exit
    Case $GUI_EVENT_DROPPED
    If @GUI_DropId = $ListView Then
    _FilesDropped()
    EndIf
    case $DelSelected
    _GUICtrlListView_DeleteItemsSelected($ListView)
    EndSwitch
    WEnd

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

    Func _ListView_Sort($cIndex = 0)
    Local $iColumnsCount, $iDimension, $iItemsCount, $aItemsTemp, $aItemsText, $iCurPos, $iImgSummand, $i, $j

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

    $iColumnsCount = _GUICtrlListView_GetColumnCount($ListView)

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

    $iDimension = $iColumnsCount * 2

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

    $iItemsCount = _GUICtrlListView_GetItemCount($ListView)

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

    If $iItemsCount = 0 Then Return ConsoleWrite('Keine Dateien in Liste vorhanden' & @CR)

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

    Local $aItemsTemp[1][$iDimension]

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

    For $i = 0 To $iItemsCount - 1
    $aItemsTemp[0][0] += 1
    ReDim $aItemsTemp[$aItemsTemp[0][0] + 1][$iDimension]

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

    $aItemsText = _GUICtrlListView_GetItemTextArray($ListView, $i)
    $iImgSummand = $aItemsText[0] - 1

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

    For $j = 1 To $aItemsText[0]
    If (StringIsFloat($aItemsText[$j]) Or StringIsInt($aItemsText[$j])) Then
    $aItemsText[$j] = Number($aItemsText[$j])
    EndIf
    $aItemsTemp[$aItemsTemp[0][0]][$j - 1] = $aItemsText[$j]
    $aItemsTemp[$aItemsTemp[0][0]][$j + $iImgSummand] = _GUICtrlListView_GetItemImage($ListView, $i, $j - 1)
    Next
    Next

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

    $iCurPos = $aItemsTemp[1][$cIndex]
    _ArraySort($aItemsTemp, 0, 1, 0, $cIndex)
    If StringInStr($iCurPos, $aItemsTemp[1][$cIndex]) Then _ArraySort($aItemsTemp, 1, 1, 0, $cIndex)

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

    ConsoleWrite($iCurPos & ' ' & $aItemsTemp[1][$cIndex] & ' ' & $aItemsTemp & @CR)

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

    For $i = 1 To $aItemsTemp[0][0]
    For $j = 1 To $iColumnsCount
    _GUICtrlListView_SetItemText($ListView, $i - 1, $aItemsTemp[$i][$j - 1], $j - 1)
    _GUICtrlListView_SetItemImage($ListView, $i - 1, $aItemsTemp[$i][$j + $iImgSummand], $j - 1)
    Next
    Next
    EndFunc ;==>_ListView_Sort

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $ListView
    If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    Local $sDrive, $sDir, $sFilename, $sExtension
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    _GUICtrlListView_SetItemSelected($ListView, DllStructGetData($tInfo, "Index"), True, True)
    $lol = _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"), 3)
    Local $aPathSplit = _PathSplit($lol, $sDrive, $sDir, $sFilename, $sExtension)
    If IsArray($aPathSplit) Then
    If FileExists($aPathSplit[0]) Then
    Local $hallo
    $hallo = MsgBox(4100, 'Datei', 'Datei: ' & $aPathSplit[0] & @CR & @CR & _
    'Laufwerk: ' & $aPathSplit[1] & @CR & @CR & _
    'Ordner: ' & $aPathSplit[2] & @CR & @CR & _
    'Dateiname: ' & $aPathSplit[3] & @CR & @CR & _
    'Dateiendung: ' & $aPathSplit[4] & @CR & @CR & @CR & @CR & _
    'Soll die Datei ausgewählt werden?')
    If $hallo = 6 Then GUICtrlSetData($DateiLabel, $aPathSplit[0])
    Else
    GUICtrlSetData($DateiLabel, _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"), 1))
    EndIf
    EndIf
    Case $LVN_COLUMNCLICK
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $ColumnIndex = DllStructGetData($tInfo, "SubItem")
    _ListView_Sort($ColumnIndex)
    Case $LVN_KEYDOWN
    $taGLVKEYDOWN = DllStructCreate("int;int;int;int;uint", $ilParam)
    $code = Hex(DllStructGetData($taGLVKEYDOWN, 4), 2)
    Select
    Case $code = Hex($VK_DELETE, 2)
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    $Selected = StringSplit(_GUICtrlListView_GetSelectedIndices($ListView), "|")
    If $Selected[0] = $id Then
    _GUICtrlListView_DeleteAllItems($ListView)
    Else
    For $i = $Selected[0] To 1 Step -1 ; Loop through the array returned by StringSplit to display the individual values.
    _GUICtrlListView_DeleteItem($ListView, $Selected[$i])
    Next
    EndIf
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To $id
    _GUICtrlListView_SetItem($ListView, $i + 1, $i, 0)
    Next
    _GUICtrlListView_EndUpdate($ListView)
    Case $code = Hex($AllesMarkieren, 2)
    Local $hDLL = DllOpen("user32.dll")
    If _IsPressed("11", $hDLL) Then
    ControlListView("", "", $ListView, "SelectAll")
    EndIf
    EndSelect
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    #Region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To UBound($aDropFiles) - 1
    $id = $id + 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    GUICtrlCreateListViewItem($id & "|" & $split[3] & $split[4] & "|" & "Bereit" & "|" & $split[0], $ListView)
    Next
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)
    _GUICtrlListView_EndUpdate($ListView)
    EndFunc ;==>_FilesDropped

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • OK Fehler Nr1 behoben

    Hab aber noch Fehler Nr 5 vergessen

    Wenn ich das Bild in die Liste rein mache kann ich weder Dateien hinzufügen noch funktioniert das Scrollen richtig wodran liegt das?

    • Offizieller Beitrag

    Zu 4 scha dir mal diese UDF an: http://www.autoitscript.com/forum/topic/12…14/#entry867799

    Und zu 5: Gib mir mal das Bild zum testen. Habe keine Bilder auf der Arbeitsmaschine

    Btw, sollte ein Hintergrundbild nur bei einem ListvIew funtionieren, das du per UDF erstellt hast (_GUICtrlListView_Create).
    Bei einem Standard-ListView wird die Funktion _GUICtrlListView_SetBkImage sofort wieder verlassen.
    Verstehen muß ich diesen Vorgang nicht, weil die Funtionalität vorhanden ist, auch ein Hintergrundbild in ein Standardlistview einzufügen.
    Ich denke du rufst die Funtion mit dem Handle auf, wechen du per GUICtrlGetHandle bekommen hast.

  • Zu2: Das Problem liegt darim, das _ArraySort Zahlen nicht als solche behandelt es wird alleine nach dem Alphabet sortiert.
    Um z.B. das Index zu sortieren ist das ganze ganz einfach umzusetzen:

    Das Problem ist jetzt, dass er mir das zwar richtig sortiert, aber der sortiert mir die Spalte mit den Zahlen nur einmal und dann tut sich nichts mehr bis ich eine andere Spalte anklicke.

    Zu 4 scha dir mal diese UDF an: autoitscript.com/forum/topic/1…ion-9-feb-14/#entry867799

    Leider ist das Script für mich zu umfangreich. Wenn ich das in mein Script include, dann funktionieren alle vorgegebenen Funktionen der UDF aber das Problem ist dass dann meine Funktionen automatisch deaktiviert werden. Meine WM_NOTIFY Funktion ist somit dann deaktiviert.
    Das löschen funktioniert dann nicht sowie Doppeltklick der Maus wandelt sich in Editieren der angeklickten Kästchen.
    Im Grunde wären da zwar meine anderen Probleme gelöst, weil die UDF z.B. schon das richtige Sortieren mitbringt. Oder das verschieben genau so wie ich mir das vorgestellt habe.

    Und zu 5: Gib mir mal das Bild zum testen. Habe keine Bilder auf der Arbeitsmaschine

    Btw, sollte ein Hintergrundbild nur bei einem ListvIew funtionieren, das du per UDF erstellt hast (_GUICtrlListView_Create).
    Bei einem Standard-ListView wird die Funktion _GUICtrlListView_SetBkImage sofort wieder verlassen.
    Verstehen muß ich diesen Vorgang nicht, weil die Funtionalität vorhanden ist, auch ein Hintergrundbild in ein Standardlistview einzufügen.
    Ich denke du rufst die Funtion mit dem Handle auf, wechen du per GUICtrlGetHandle bekommen hast.

    Mit den Dateien hab ich es zwar hingekriegt und mit dem Hintergrundbild was aber immer noch nicht iO ist, ist das Scrollen oder das Löschen. Wo genau mein Problem ist siehe Bilder. Wie schon gesagt, wenn ich unten alles markiere und dann aber ganz nach oben wieder scrolle und auf Delete Taste klicke oder auch so beim Löschen, dann passiert das wie auf den Bildern zu sehen.

    Ich hatte dazu auch mal eine Funktion erstellt.
    _GuiCtrlListView_MoveItem

    Mir Persönlich gefällt es mehr wenn ich mit der Maus die Positionen tauschen kann anstatt da noch extra Buttons rein zu machen. Das macht die von Raupi verlinkte UDF wirklich sehr gut.
    Ich würde gerne nur wissen wie ich nur diese Funktion und das Editieren der einzelnen Felder aus der UDF in meinem Script verwenden kann ohne dass mir die anderen Funktionen flöten gehen?

    hier nochmal mein aktuelleres Script

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 28.02.2015 17:45:10
    #EndRegion

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

    #include <array.au3>
    #include <ScreenCapture.au3>
    #include <Misc.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ColorConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <SendMessage.au3>
    #include <Sound.au3>

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

    #include ".\GUIListViewEx\GUIListViewEx.au3"

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

    Global $aDropFiles[1]
    Global Const $VK_DELETE = 0x2E
    Global Const $AllesMarkieren = 0x41
    Local $hDLL = DllOpen("user32.dll")

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

    $Form1 = GUICreate("Liste Sortieren", 333, 460, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_SYSMENU, $WS_POPUP, $WS_GROUP, $WS_CLIPSIBLINGS), $WS_EX_ACCEPTFILES)
    GUICtrlSetState($Form1, $GUI_DROPACCEPTED)
    GUISetOnEvent($GUI_EVENT_DROPPED, "_FilesDropped")
    $Pic1 = GUICtrlCreatePic("C:\Windows\Web\Screen\img103.jpg", 0, 0, 332, 436, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    GUICtrlSetState($Pic1, $GUI_DISABLE)

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

    $ExitButton = GUICtrlCreateButton("Exit", 266, 8, 60, 25)
    $DateiLabel = GUICtrlCreateLabel("Keine Datei ausgewählt", 8, 40, 316, 40)
    GUICtrlSetColor(-1, 0x00FF00)
    GUICtrlSetBkColor(-1, 0x000000)

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

    Local $ListView = GUICtrlCreateListView("Nr|Titel|Status|Datei", 8, 85, 316, 343, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    $ListView = GUICtrlGetHandle($ListView)
    GUICtrlSetBkColor($ListView, 0x1E1E1E)
    GUICtrlSetColor($ListView, 0xffffff)
    GUICtrlSetState($ListView, BitOR($GUI_DROPACCEPTED, $GUI_FOCUS))
    _GUICtrlListView_SetBkImage($ListView, "C:\Windows\Web\Screen\img103.jpg",1)
    _GUICtrlListView_SetColumnWidth($ListView, 0, 35)
    _GUICtrlListView_SetColumnWidth($ListView, 1, 200)
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)

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

    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    GUISetState(@SW_SHOW)

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

    ; Register for sorting, dragging and editing
    ;~ _GUIListViewEx_MsgRegister(True, True, True)

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

    ; Set the ListView as active
    ;~ _GUIListViewEx_SetActive(1)

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

    For $i = 0 To 102
    _GUICtrlListView_AddItem($ListView, $i)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 2 Irgendetwas", 1, 1)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 3", 2, 2)
    _GUICtrlListView_AddSubItem($ListView, $i, $i & " Spalte 4", 3, 3)
    Next

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

    $ListView_Index = _GUIListViewEx_Init($ListView, _GUICtrlListView_GetItemCount($ListView), 0, 0, True, 2 + 4 + 8 + 16 + 32, "1")

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

    While Sleep(10)
    $aRet = _GUIListViewEx_EditOnClick(0)
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ExitButton
    Exit
    Case $GUI_EVENT_DROPPED
    If @GUI_DropId = $ListView Then
    _FilesDropped()
    EndIf
    EndSwitch
    If _IsPressed("11", $hDLL) And _IsPressed("50", $hDLL) Then _ScreenCapture_CaptureWnd("Captured-"&@YEAR&@MON&@MDAY&@HOUR&@MIN&@SEC&".jpg", $Form1)
    WEnd

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

    Func _ListView_Sort($cIndex = 0)
    Local $iColumnsCount, $iDimension, $iItemsCount, $aItemsTemp, $aItemsText, $iCurPos, $iImgSummand, $i, $j

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

    $iColumnsCount = _GUICtrlListView_GetColumnCount($ListView)

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

    $iDimension = $iColumnsCount * 2

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

    $iItemsCount = _GUICtrlListView_GetItemCount($ListView)

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

    If $iItemsCount = 0 Then Return ConsoleWrite('Keine Dateien in Liste vorhanden' & @CR)

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

    Local $aItemsTemp[1][$iDimension]

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

    For $i = 0 To $iItemsCount - 1
    $aItemsTemp[0][0] += 1
    ReDim $aItemsTemp[$aItemsTemp[0][0] + 1][$iDimension]

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

    $aItemsText = _GUICtrlListView_GetItemTextArray($ListView, $i)
    $iImgSummand = $aItemsText[0] - 1

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

    For $j = 1 To $aItemsText[0]
    If (StringIsFloat($aItemsText[$j]) Or StringIsInt($aItemsText[$j])) Then
    $aItemsText[$j] = Number($aItemsText[$j])
    EndIf
    $aItemsTemp[$aItemsTemp[0][0]][$j - 1] = $aItemsText[$j]
    $aItemsTemp[$aItemsTemp[0][0]][$j + $iImgSummand] = _GUICtrlListView_GetItemImage($ListView, $i, $j - 1)
    Next
    Next

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

    $iCurPos = $aItemsTemp[1][$cIndex]
    _ArraySort($aItemsTemp, 0, 1, 0, $cIndex)
    If StringInStr($iCurPos, $aItemsTemp[1][$cIndex]) Then _ArraySort($aItemsTemp, 1, 1, 0, $cIndex)

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

    ConsoleWrite($iCurPos & ' ' & $aItemsTemp[1][$cIndex] & ' ' & $aItemsTemp & @CR)

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

    For $i = 1 To $aItemsTemp[0][0]
    For $j = 1 To $iColumnsCount
    _GUICtrlListView_SetItemText($ListView, $i - 1, $aItemsTemp[$i][$j - 1], $j - 1)
    _GUICtrlListView_SetItemImage($ListView, $i - 1, $aItemsTemp[$i][$j + $iImgSummand], $j - 1)
    Next
    Next
    EndFunc ;==>_ListView_Sort

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $ListView
    If Not IsHWnd($ListView) Then $hWndListView = GUICtrlGetHandle($ListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
    Local $sDrive, $sDir, $sFilename, $sExtension
    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    _GUICtrlListView_SetItemSelected($ListView, DllStructGetData($tInfo, "Index"), True, True)
    $lol = _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"), 3)
    Local $aPathSplit = _PathSplit($lol, $sDrive, $sDir, $sFilename, $sExtension)
    If IsArray($aPathSplit) Then
    If FileExists($aPathSplit[0]) Then
    Local $hallo
    $hallo = MsgBox(4100, 'Datei', 'Datei: ' & $aPathSplit[0] & @CR & @CR & _
    'Laufwerk: ' & $aPathSplit[1] & @CR & @CR & _
    'Ordner: ' & $aPathSplit[2] & @CR & @CR & _
    'Dateiname: ' & $aPathSplit[3] & @CR & @CR & _
    'Dateiendung: ' & $aPathSplit[4] & @CR & @CR & @CR & @CR & _
    'Soll die Datei ausgewählt werden?')
    If $hallo = 6 Then GUICtrlSetData($DateiLabel, $aPathSplit[0])
    Else
    GUICtrlSetData($DateiLabel, _GUICtrlListView_GetItemText($ListView, DllStructGetData($tInfo, "Index"), 1))
    EndIf
    EndIf
    Case $LVN_COLUMNCLICK
    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    Local $ColumnIndex = DllStructGetData($tInfo, "SubItem")
    _ListView_Sort($ColumnIndex)
    Case $LVN_KEYDOWN
    $taGLVKEYDOWN = DllStructCreate("int;int;int;int;uint", $ilParam)
    $code = Hex(DllStructGetData($taGLVKEYDOWN, 4), 2)
    Select
    Case $code = Hex($VK_DELETE, 2)
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    $Selected = StringSplit(_GUICtrlListView_GetSelectedIndices($ListView), "|")
    If $Selected[0] = $id Then
    _GUICtrlListView_DeleteAllItems($ListView)
    Else
    For $i = $Selected[0] To 1 Step -1 ; Loop through the array returned by StringSplit to display the individual values.
    _GUICtrlListView_DeleteItem($ListView, $Selected[$i])
    Next
    EndIf
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To $id
    _GUICtrlListView_SetItem($ListView, $i + 1, $i, 0)
    Next
    _GUICtrlListView_EndUpdate($ListView)
    Case $code = Hex($AllesMarkieren, 2)
    Local $hDLL = DllOpen("user32.dll")
    If _IsPressed("11", $hDLL) Then
    ControlListView("", "", $ListView, "SelectAll")
    EndIf
    EndSelect
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    #Region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Func _FilesDropped()
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($ListView)
    $id = _GUICtrlListView_GetItemCount($ListView)
    For $i = 0 To UBound($aDropFiles) - 1
    $id = $id + 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    GUICtrlCreateListViewItem($id & "|" & $split[3] & $split[4] & "|" & "Bereit" & "|" & $split[0], $ListView)
    Next
    _GUICtrlListView_SetColumnWidth($ListView, 3, 0)
    _GUICtrlListView_EndUpdate($ListView)
    EndFunc ;==>_FilesDropped

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag
    Zitat

    Meine WM_NOTIFY Funktion ist somit dann deaktiviert.

    Dann schreibe deine Funktionen in die WM_Notify der UDF

  • Dann schreibe deine Funktionen in die WM_Notify der UDF

    das habe ich mir auch schon überlegt, nur ich verstehe die Funktion der Doppeltklick Taste in der UDF nicht. Die ist im Case nicht so drin $NM_DBLCLK wie ich die kenne. Ich habe es ja schon versucht und daran gescheitert. Wie kann ich die jetzige linke Doppelklick Taste zum Editieren auf $NM_RDBLCLK bzw. auf Doppelklick der rechten Maustaste umlegen? Ist das in der UDF möglich?