Drag and Drop mit mehrer Datein

  • Habt ihr eine Idee wie ich mehrer Dateien gleichzeitig in mein Fenster einfügen.
    Also mit strg mehrere Datein makieren und aufeinmal in das Fenster einfügen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #Include <Misc.au3>

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

    $Gui1 = GUICreate("Drag & Drop", 550, 430, -1, -1, -1, $WS_EX_ACCEPTFILES)

    $listview = GUICtrlCreateListView ("Name |Dateityp |Dateipfad ",10,55,530,280)
    GUICtrlSetState ($listview, $GUI_DROPACCEPTED)

    $Button_DateiHinzufuegen = GUICtrlCreateButton ("Datei Hinzufügen",25,340,100)
    $Button_DateiEntfernen = GUICtrlCreateButton ("Datei Enfernen",140,340,100)
    $Button_Beenden = GUICtrlCreateButton ("Beenden",430,378,90)

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

    GUISetState()
    _GUICtrlListView_RegisterSortCallBack($listview)

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_DROPPED
    Dim $szDrive, $szDir, $szFName, $szExt
    $PathSplit = _PathSplit(@GUI_DragFile, $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem ($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2],$listview)

    Case $msg = $Button_DateiHinzufuegen
    $Datei_Input = FileOpenDialog ("Dateien Hinzufügen", @MyDocumentsDir, "Alle Dateien (*.*)", 7)
    $Datei = StringSplit($Datei_Input,"|")
    Dim $szDrive, $szDir, $szFName, $szExt
    For $i = 1 To $Datei[0] Step 1
    $PathSplit = _PathSplit($Datei[$i], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem ($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2],$listview)
    Next

    Case $msg = $Button_DateiEntfernen
    GUICtrlDelete (GUICtrlRead ($listview))

    Case $msg = $listview
    _GUICtrlListView_SortItems ($listview, GUICtrlGetState ($listview))

    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Button_Beenden
    ExitLoop

    EndSelect

    If _IsPressed("2E") Then GUICtrlDelete (GUICtrlRead ($listview))

    WEnd

    _GUICtrlListView_UnRegisterSortCallBack($listview)

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

    3 Mal editiert, zuletzt von Amateur (3. November 2011 um 16:40)

    • Offizieller Beitrag

    Hier hast du deine Lösung:

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2011-10-31 18:02:05
    #EndRegion

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <Misc.au3>
    Global $gaDropFiles[1], $iDropItem = -1
    Global $WM_DROPFILES = 0x233

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

    $Gui1 = GUICreate("Drag & Drop", 550, 430, -1, -1, -1, $WS_EX_ACCEPTFILES)

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

    $listview = GUICtrlCreateListView("Name |Dateityp |Dateipfad ", 10, 55, 530, 280)
    GUICtrlSetState($listview, $GUI_DROPACCEPTED)

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

    $Button_DateiHinzufuegen = GUICtrlCreateButton("Datei Hinzufügen", 25, 340, 100)
    $Button_DateiEntfernen = GUICtrlCreateButton("Datei Enfernen", 140, 340, 100)
    $Button_Beenden = GUICtrlCreateButton("Beenden", 430, 378, 90)

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

    GUISetState()
    _GUICtrlListView_RegisterSortCallBack($listview)
    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')
    While 1
    $msg = GUIGetMsg()
    Select

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

    Case $msg = $Button_DateiHinzufuegen
    $Datei_Input = FileOpenDialog("Dateien Hinzufügen", @MyDocumentsDir, "Alle Dateien (*.*)", 7)
    $Datei = StringSplit($Datei_Input, "|")
    Dim $szDrive, $szDir, $szFName, $szExt
    For $i = 1 To $Datei[0] Step 1
    $PathSplit = _PathSplit($Datei[$i], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2], $listview)
    Next

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

    Case $msg = $Button_DateiEntfernen
    GUICtrlDelete(GUICtrlRead($listview))

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

    Case $msg = $listview
    _GUICtrlListView_SortItems($listview, GUICtrlGetState($listview))

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

    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Button_Beenden
    ExitLoop

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

    EndSelect

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

    If _IsPressed("2E") Then GUICtrlDelete(GUICtrlRead($listview))

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

    WEnd

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

    _GUICtrlListView_UnRegisterSortCallBack($listview)

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $szDrive, $szDir, $szFName, $szExt
    Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 0)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', 0, 'int', 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate('wchar[' & $nSize & ']')
    DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', DllStructGetPtr($pFileName), 'int', $nSize)
    ReDim $gaDropFiles[$i + 1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    $PathSplit = _PathSplit($gaDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2], $listview)
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit]
  • Hi Raupi,
    ich habe bei mir noch diese 3 Jahre alte Version gefunden

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $gui = GUICreate("My GUI", Default, Default, Default, Default, Default, $WS_EX_ACCEPTFILES)

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

    $listview = GUICtrlCreateListView("Name |Dateityp |Dateipfad ", 10, 55, 530, 280)

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

    GUISetState()

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

    GUIRegisterMsg(0x233, "On_WM_DROPFILES")

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

    While 1
    Sleep(100)
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    EndSelect
    WEnd

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

    Func On_WM_DROPFILES($hWnd, $msg, $wParam, $lParam)
    Local $tDrop, $aRet, $iCount
    Local $szDrive, $szDir, $szFName, $szExt
    ;string buffer for file path
    $tDrop = DllStructCreate("char[260]")
    ;get file count
    $aRet = DllCall("shell32.dll", "int", "DragQueryFile", _
    "hwnd", $wParam, _
    "uint", -1, _
    "ptr", DllStructGetPtr($tDrop), _
    "int", DllStructGetSize($tDrop) _
    )
    $iCount = $aRet[0]
    ;get file paths
    For $i = 0 To $iCount - 1
    $aRet = DllCall("shell32.dll", "int", "DragQueryFile", _
    "hwnd", $wParam, _
    "uint", $i, _
    "ptr", DllStructGetPtr($tDrop), _
    "int", DllStructGetSize($tDrop) _
    )
    $PathSplit = _PathSplit(DllStructGetData($tDrop, 1), $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2], $listview)
    Next
    ;finalize
    DllCall("shell32.dll", "int", "DragFinish", "hwnd", $wParam)
    Return
    EndFunc ;==>On_WM_DROPFILES

    [/autoit]

    Ist die anders als deine?

    Kenne mich leider mit dem DllCall-Zeugs nicht aus :S

    • Offizieller Beitrag

    Mein Beispiel benutzt die Unicode Funktionen, sonst ist da kaum ein Unterschied.

  • Danke :)
    Eine kleine Frage habe ich noch.
    Wie kann man, wenn man jetzt mehrere Dateien in der Liste hat, mehrere markieren und herauslöschen.
    Zurzeit kann man nur eines markieren und löschen

    Einmal editiert, zuletzt von Amateur (1. November 2011 um 12:46)

  • Habe mal gegoogelt und ein Funktion gefunden namens $LVS_EX_CHECKBOXES
    was am ehestens wie deins klingt
    blick aber nicht durch was das macht

  • mit _GuiCtrlListView_SetExtendedStyle () den Stil auf einen button oder eine andere abfrage zuweisen.
    Dann sollten Checkboxen bei jedem Item auftauche welche geklickt werden können die du wiederum in einer neuen Abfrage mit _GuiCtrlListView_GetItemChecked () abfragen kannst und dann wenn zutrifft in deine löschen func übernimmst.

    (_GuiCtrlListView_DeleteItem () )

    Schreibe jetzt nur mal so aus dem kopf, weiß nicht ob der genaue wortlaut der befehle stimmt ? Steht aber ansonsten alles in der Hilfe auch nochmal.
    Oder du machst eine Abfrage mit _guiCtrlListView_GetItemSelected () und übergibst diese dann an deine löschen func.


    MfG
    Stinger2k

    Spoiler anzeigen
    Zitat

    Ich weiß wo dein Haus wohnt... 8o

  • HILFE ???
    Habe jz mehrer Sachen probiert womit ich mehrer Sachen löschen kann und habe noch einiges dazuprogrammiert
    Und jz kann ich gar keine Datei mehr entfernen
    weiß aber nicht wiso ? ?(

    Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ; 2011-10-31 18:02:05
    #EndRegion

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

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <Misc.au3>
    #include <Array.au3>

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

    Global $gaDropFiles[1], $iDropItem = -1
    Global $WM_DROPFILES = 0x233
    Global $i
    DIM $array[1]=[1]

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

    ;~ $Gui1 = GUICreate("Drag & Drop", 550, 430, -1, -1, -1, $WS_EX_ACCEPTFILES)

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

    ;~ $listview = GUICtrlCreateListView("Name ", 10, 55, 530, 280)

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

    $Gui1 = GUICreate("Drag & Drop", 152, @DesktopHeight-100, @DesktopWidth-163, 5, -1, $WS_EX_ACCEPTFILES)

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

    $listview = GUICtrlCreateListView("Name ", 0, 0, 530, @DesktopHeight-200)
    GUICtrlSetState($listview, $GUI_DROPACCEPTED)

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

    ;~ $Button_DateiHinzufuegen = GUICtrlCreateButton("Datei Hinzufügen", 25, 340, 100)
    ;~ $Button_DateiEntfernen = GUICtrlCreateButton("Datei Enfernen", 140, 340, 100)
    $Button_Start = GUICtrlCreateButton("Start", 30, @DesktopHeight-160, 90)

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

    GUISetState()
    _GUICtrlListView_RegisterSortCallBack($listview)
    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')

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

    While 1
    $msg = GUIGetMsg()
    Select

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

    Case $msg = $listview
    _GUICtrlListView_SortItems($listview, GUICtrlGetState($listview))

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

    Case $msg = $GUI_EVENT_CLOSE
    GUIDelete ($GUI1)
    Exit

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

    Case $msg = $Button_Start

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

    If UBound($array) = 1 Then

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

    MsgBox(4096,"Info","Bitte ziehen sie Lieder in das Feld")

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

    ElseIf UBound($array) > 1 Then

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

    ;~ _ArrayDisplay($array)
    ;~ MSGBox(4096,"", UBound($array))
    MSGBox(4096,"",$array[1])
    MSgBox(4096,"","add " & $array[1])
    GUIDelete ($GUI1)
    ExitLoop

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

    EndIf

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

    EndSelect

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

    If _IsPressed("2E") Then GUICtrlDelete(GUICtrlRead($listview))

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

    WEnd

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

    _GUICtrlListView_UnRegisterSortCallBack($listview)

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $szDrive, $szDir, $szFName, $szExt
    Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 0)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', 0, 'int', 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate('wchar[' & $nSize & ']')
    DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', DllStructGetPtr($pFileName), 'int', $nSize)
    ReDim $gaDropFiles[$i + 1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    $PathSplit = _PathSplit($gaDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($PathSplit[3] & "|" & $PathSplit[4] & "|" & $PathSplit[1] & $PathSplit[2], $listview)

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

    _ArrayAdd( $array,$PathSplit[0])

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

    Next
    EndFunc ;==>WM_DROPFILES_FUNC

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

    $Auswahl=GuiCreate("Auswahl", 220, 100, @DesktopWidth-230, @DesktopHeight-200)
    $Button_Herunterfahren = GUICtrlCreateButton("Herunterfahren", 10, 10 ,90)
    $Button_StandBy = GUICtrlCreateButton("StandBy", 120, 10, 90)
    $Button_Abmelden = GUICtrlCreateButton("Abmelden", 10, 50, 90)
    $Button_Neustarten = GUICtrlCreateButton("Neustarten", 120, 50, 90)
    GUISetState()

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

    while 1

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

    $msg = GUIGetMsg()
    Select

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

    Case $msg = $Button_Herunterfahren

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

    $a=1
    ExitLoop

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

    Case $msg = $Button_StandBy

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

    $a=64
    ExitLoop

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

    Case $msg = $Button_Abmelden

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

    $a=0
    ExitLoop

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

    Case $msg = $Button_Neustarten

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

    $a=2
    ExitLoop

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

    Case $msg = $GUI_EVENT_CLOSE
    Exit

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

    EndSelect

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

    WEnd

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

    GUIDelete ($Auswahl)

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

    $vlcconfigfile = @AppDataDir&"\vlc\vlcrc"
    $listen = " "

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

    Opt("tcptimeout",500)

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

    ;Write correct settings to config file.
    $vlcfile = FileOpen($vlcconfigfile,1)
    _FileWriteToLine($vlcconfigfile,2529,"rc-host=127.0.0.1:2150",1);hostname and port
    _FileWriteToLine($vlcconfigfile,2526,"rc-quiet=1",1);use quiet mode
    FileClose($vlcfile)

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

    ;Run VLC Media Player and opens console
    $vlcexe = Run(@ProgramFilesDir&"\VideoLAN\VLC\vlc.exe --extraintf rc")

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

    Sleep(1500);Gives some time to start VLC

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

    ;Connect to VLC console
    TCPStartup()
    Global $vlcmp=TCPConnect("127.0.0.1",2150)
    If $vlcmp=-1 Then
    MsgBox(0,"Error","Connecting error.")
    Exit
    EndIf

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

    _SendData("loop")

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

    $i = UBound($array)-1

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

    _SendData("add " & $array[1])

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

    while $i > 0
    _SendData("enqueue " & $array[$i])
    $i = $i -1
    Sleep(100)
    WEnd

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

    Func _SendData($command)
    If $vlcmp = -1 Then;Checks if connected else gives error code see help file TCPConnect
    MsgBox(0,"",$vlcmp)
    Else
    TCPSend($vlcmp,$command&@CRLF);Send data to console
    $listen = TCPRecv($vlcmp,4096);Check if it gets someting back and shows it in inputbox
    Return $listen
    EndIf
    EndFunc;=> _SendData()

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

    $i = UBound($array)-1

    [/autoit]

    3 Mal editiert, zuletzt von Amateur (2. November 2011 um 22:59)

  • Habe die Lösung schon gefunden.
    Sorry für das Postet würde mich trotzdem interessieren warum das an der Zeile liegt ?

    [autoit]

    $listview = GUICtrlCreateListView("Name |Dateityp |Dateipfad ", 0, 0, 530, @DesktopHeight-200)

    [/autoit]
  • Danke :)
    Eine kleine Frage habe ich noch.
    Wie kann man, wenn man jetzt mehrere Dateien in der Liste hat, mehrere markieren und herauslöschen.
    Zurzeit kann man nur eines markieren und löschen

    Da bei derErstellung des LV-Controls ohne Style-Angaben

    Zitat

    Standard (-1) : $LVS_SHOWSELALWAYS, $LVS_SINGLESEL
    Erzwungener Stil : $LVS_REPORT

    enthalten ist kannst du nur eines auswählen. Wenn du deine LV so:

    [autoit]

    $listview = GUICtrlCreateListView("Name |Dateityp |Dateipfad ", 0, 0, 530, @DesktopHeight-200,BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))

    [/autoit]

    erstellst kannst du mehrere auswählen. Zum löschen kannst du dann

    [autoit]

    _GUICtrlListView_DeleteItemsSelected(GUICtrlGetHandle($listview))

    [/autoit]

    verwenden, dazu benötigst du noch

    [autoit]

    #Include <GuiListView.au3>

    [/autoit]

    am Skriptanfang. Das auslösen der Löschfunktion kann über einen Button geschehen oder eleganter durch ein Contextmenü:

    [autoit]

    $idContextmenu = GUICtrlCreateContextMenu($listview )
    $idDeletemenu = GUICtrlCreateMenu("Löschen...", $idContextmenu)
    $idDeleteAll = GUICtrlCreateMenuItem("Alle Einträge", $idDeletemenu)
    $idDeleteitem = GUICtrlCreateMenuItem("ausgewählte Einträge", $idDeletemenu)

    [/autoit]

    das du nach dem Erstellen der LV einbinden kannst. In [Beispiel] NeMP3-P (MP3-Player) Version 0.8.4.7 habe ich dies gemacht, ist zwar im OnEventMode geschrieben lässt sich aber leicht in den GuiGetMsg-Mode umsetzen,

    mfg autoBert