Drag & Drop von Dateien in eine Liste

  • [autoit]

    $list1 = GUICtrlCreateList("", 8, 32, 241, 279)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)

    [/autoit][autoit]

    Switch GUIGetMsg()
    Case $GUI_EVENT_DROPPED
    GUICtrlSetData($list1, @GUI_DragFile)
    EndSwitch

    [/autoit]


    Problem ist, dass ich nichts einfügen kann... will aber GUICtrlCreateList benutzen.

  • Hallo mipez,

    hier ein kleines Beispiel für Drag & Drop mit ListBox:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GuiListBox.au3>
    #include <ListboxConstants.au3>
    #include <File.au3>
    #include <array.au3>

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

    Global $szDrive, $szDir, $szFName, $szExt
    Global $aDropFiles[1], $WM_DROPFILES = 0x233

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

    $idGUI = GUICreate("Flaggen", 300, 115, -1, -1, -1, $WS_EX_ACCEPTFILES)
    $idListe = GUICtrlCreateList("", 10, 10, 180, 80, BitOR($WS_VSCROLL, $LBS_NOTIFY)) ;,BitOR($LBS_SORT, $LBS_MULTIPLESEL)
    GUICtrlSetState($idListe, $GUI_DROPACCEPTED)
    $idNeu = GUICtrlCreateButton("...", 200, 10, 30, 25)
    $idVorschau = GUICtrlCreatePic(@ScriptDir & "\Flaggen\NA.jpg", 210, 40, 36, 24)
    $idInfo = GUICtrlCreateButton("&alle auslesem", 10, 90, 180, 25)
    GUISetState()

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

    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idInfo
    $count = _GUICtrlListBox_GetCount($idListe)
    Dim $aListe[$count]
    For $i = 0 To $count - 1
    $aListe[$i] = _GUICtrlListBox_GetText($idListe, $i)
    Next
    _ArrayDisplay($aListe)
    Case $idNeu
    $sAlt = GUICtrlRead($idListe)
    $sPlus = FileOpenDialog("La(e)nder auswählen:", @ScriptDir & "\Flaggen", "Bilder (*.jpg)", 7, "", $idGUI)
    $aPlus = StringSplit($sPlus, "|")
    If IsArray($aPlus) Then
    ;_ArrayDisplay($aPlus)
    If $aPlus[0] > 1 Then
    For $i = 2 To $aPlus[0]
    ConsoleWrite($aPlus[$i] & @CRLF)
    _GUICtrlListBox_InsertString($idListe, $aPlus[$i], $i - 2)
    Next
    Else
    _PathSplit($sPlus, $szDrive, $szDir, $szFName, $szExt)
    ConsoleWrite($szFName & @CRLF)
    _GUICtrlListBox_InsertString($idListe, $szFName & $szExt, 0)
    EndIf
    EndIf
    Case $idListe
    ConsoleWrite(GUICtrlRead($idListe) & ".jpg" & @CRLF)
    GUICtrlSetImage($idVorschau, @ScriptDir & "\Flaggen\" & GUICtrlRead($idListe))
    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 $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
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;ConsoleWrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    ; Switch $szExt
    ; Case ".JPG"
    _GUICtrlListBox_InsertString($idListe,$szFName & $szExt,0)
    ; EndSwitch
    Next
    EndFunc ;==>_FilesDropped

    [/autoit]

    es erlaubt auch Mehrfachauswahl. Zum Testen benötigst du noch autoit.de/wcf/attachment/9443/ Viel Spass damit,

    mfg (Auto)Bert