Drag and drop in ListView funktioniert nicht

  • Hallo Leute,
    in habe, wie ihr schon gelesen habt ein Problem mit dem drag and drop in ein ListView.

    Hier mein Quellcode

    Spoiler anzeigen
    [autoit]


    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinAPISys.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global Const $WM_DROPFILES = 0x0233
    Global $gaDropFiles[1], $str = ""
    $hGUI = GUICreate('Test',550,300,-1,-1, -1,$WS_EX_ACCEPTFILES)
    $idList=GUICtrlCreateListView('Datei|Größe|Hash',10,35,530,240,$ES_AUTOVSCROLL+$ES_READONLY+$WS_VSCROLL)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    _GUICtrlListView_SetColumnWidth($idList,0,390)
    _GUICtrlListView_SetColumnWidth($idList,1,100)
    _GUICtrlListView_SetColumnWidth($idList,2,250)
    GUIRegisterMsg(0x0233, "WM_DROPFILES")
    GUIRegisterMsg ($WM_DROPFILES, "WM_DROPFILES_FUNC")

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

    GUISetState()
    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_DROPPED
    $str = ""
    For $i = 0 To UBound($gaDropFiles) - 1
    $str &= "|" & $gaDropFiles[$i]
    Next
    GUICtrlSetData($idList, $str)
    EndSwitch
    WEnd

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

    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 $gaDropFiles[$i+1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>_WM_DROPFILES_FUNC

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

    Func WM_DROPFILES($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Local $aFileList
    Switch $hWnd
    Case $hGUI
    $aFileList = _WinAPI_DragQueryFileEx($wParam)
    If IsArray($aFileList) Then
    For $A = 1 To $aFileList[0]
    ConsoleWrite($aFileList[$A] & @CRLF)
    Next
    EndIf
    _WinAPI_DragFinish($wParam)
    Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_DROPFILES

    [/autoit]


    Die Dateinamen werden bei mir in den Header des ListViews gepackt, warum? ?(?(
    Und warum erhalte ich den Fehler, dass die Konstante $WM_DROPFILES ( Zeile 8 ) bereits definiert ist?

    Gruß Gremlin

    Einmal editiert, zuletzt von Gremlin78 (5. Februar 2015 um 10:55)

    • Offizieller Beitrag

    1. $WM_DROPFILES wird in WindowsConstants.au3 schon definiert, deshalb der Fehler.
    2. GUICtrlSetData Setzt bei einem ListView die Daten des Headers. Zum hinzufügen mußt du GUICtrlCreateListViewItem nehmen.

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinAPISys.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $gaDropFiles[1], $str = ""
    $hGUI = GUICreate('Test', 550, 300, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idList = GUICtrlCreateListView('Datei|Größe|Hash', 10, 35, 530, 240, $ES_AUTOVSCROLL + $ES_READONLY + $WS_VSCROLL)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    _GUICtrlListView_SetColumnWidth($idList, 0, 390)
    _GUICtrlListView_SetColumnWidth($idList, 1, 100)
    _GUICtrlListView_SetColumnWidth($idList, 2, 250)
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $GUI_EVENT_DROPPED
    $str = ""
    For $i = 0 To UBound($gaDropFiles) - 1
    GUICtrlCreateListViewItem( $gaDropFiles[$i],$idList)
    Next
    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("test" & @CRLF)
    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 $gaDropFiles[$i + 1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit]


    Btw, warum registrierst du für eine Message 2 Funktionen? Es wird nur die letzte Zuordnung ausgeführt !!!!!

  • Vielen Dank Raupi,
    du bist Spitze. :thumbup:
    Ist es eigentlich auch möglich den gedroppten Inhalt nach Dateien und Ordnern zu überprüfen?
    Damit ich quasi für Dateien FileGetSize und für Ordner DirGetSize zum bestimmen der Größe nutzen kann.
    Gruß Gremlin

    Einmal editiert, zuletzt von Gremlin78 (5. Februar 2015 um 11:43)

    • Offizieller Beitrag

    Weil ich gerade Lngeweile habe, hier noch mal die Lösung mit der 2. WM_Dropfile Funktion (Fehlerbereinigt)

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinAPISys.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $gaDropFiles[1], $str = ""
    $hGUI = GUICreate('Test', 550, 300, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idList = GUICtrlCreateListView('Datei|Größe|Hash', 10, 35, 530, 240, $ES_AUTOVSCROLL + $ES_READONLY + $WS_VSCROLL)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    _GUICtrlListView_SetColumnWidth($idList, 0, 390)
    _GUICtrlListView_SetColumnWidth($idList, 1, 100)
    _GUICtrlListView_SetColumnWidth($idList, 2, 250)
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit

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

    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    #forceref $msgID,$lParam
    Local $aFileList
    Switch $hWnd
    Case $hGUI
    $aFileList = _WinAPI_DragQueryFileEx($wParam)
    If IsArray($aFileList) Then
    For $A = 1 To $aFileList[0]
    GUICtrlCreateListViewItem($aFileList[$A], $idList)
    Next
    EndIf
    _WinAPI_DragFinish($wParam)
    Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_DROPFILES_FUNC

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

    Habe dein Edit erst jetzt gesehen, klar ist es möglich die Dateigröße/Verzeichnisgröße einzufügen.

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinAPISys.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>

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

    Global $gaDropFiles[1], $str = ""
    $hGUI = GUICreate('Test', 550, 300, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idList = GUICtrlCreateListView('Datei|Größe|Hash', 10, 35, 530, 240, $ES_AUTOVSCROLL + $ES_READONLY + $WS_VSCROLL)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    _GUICtrlListView_SetColumnWidth($idList, 0, 390)
    _GUICtrlListView_SetColumnWidth($idList, 1, 100)
    _GUICtrlListView_SetColumnWidth($idList, 2, 250)
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case -3
    Exit

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

    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    #forceref $hWnd,$msgID,$lParam
    Local $aFileList
    ConsoleWrite($hWnd & @CRLF)
    Switch $hWnd
    Case $hGUI
    $aFileList = _WinAPI_DragQueryFileEx($wParam)
    If IsArray($aFileList) Then
    For $A = 1 To $aFileList[0]
    If FileGetAttrib($aFileList[$A]) = "D" Then ; Dpropfile ist ein Verzeichnis
    Local $iSize = DirGetSize($aFileList[$A])
    Else
    Local $iSize = FileGetSize($aFileList[$A])
    EndIf
    GUICtrlCreateListViewItem($aFileList[$A] & "|" & $iSize, $idList)
    Next
    EndIf
    _WinAPI_DragFinish($wParam)
    Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_DROPFILES_FUNC

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