Ordner per Drag & Drop in ListView einfügen...

  • Hallo zusammen,

    kürzlich hatte ich zu einigen MP3-Dateiproblemen angefragt. Das Ganze läuft so auch gut.
    Nun bin ich am Feinschliff und bin da auf ein Problem gestoßen.
    Ich wähle nach und nach einzelne Ordner mittels FileSelectFolder aus und ordne diese einem LiestView zu. Daraus wird dann ein Profil erstellt. Das geht auch prima... ist aber sehr umständlich.
    Ich habe nun hier im Forum ca. 2h gesucht. Aber außer daß ich mit einem DLL-Aufruf (shell32) arbeiten muß hab keinen richtigen Ansatz gefunfden.

    Also:
    Ich habe ein leeren ListView mit 3 Spalten und möchte in die erste Spalte per d&d einen Ordner aus einem externem Programm (zB Explorer oder Totalcommader usw.) einfügen. ListView hab ich zum d&d mit dem Style $LVS_EX_HEADERDRAGDROP frei gegeben....

    Und an diesem Punkt bin ich gegen die Wand gelaufen... ich komm nicht weiter...

    Könnt ihr mir bitte eine kurtze Strategie aufzeigen, wie sowas gemacht wird?
    Das ist sicher nicht kompliziert. Oder anders .. ich hab die Tür in der Wand nicht gesehen...

    Ich dank euch schon mal....

    Wenn Du's eilig hast - geh langsam...

    Einmal editiert, zuletzt von De Rand Ere (14. Februar 2014 um 15:45)

  • Hier hast ein passendes Script: http://www.autoitscript.com/forum/topic/41…tview/?p=307469

    Hab das mal für die aktuelle Autoitversion angepasst:

    Spoiler anzeigen
    [autoit]

    ; original by lazycat
    ; modded by xcal

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

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

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

    Global $gaDropFiles[1]

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

    GUICreate('', 320, 220, -1, -1, -1, $WS_EX_ACCEPTFILES)

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

    $list = GUICtrlCreateListView('Files', 10, 10, 300, 200)
    GUICtrlSendMsg($list, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, -1)
    GUICtrlSetState($list, $GUI_DROPACCEPTED)

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

    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')

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

    GUISetState()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_DROPPED
    For $i = 0 To UBound($gaDropFiles) - 1
    GUICtrlCreateListViewItem($gaDropFiles[$i], $list)
    Next
    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

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

    Func quit()
    Exit
    EndFunc

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Vielen Dank für Deine Zeilen.
    Kam leider erst Heute dazu hier reinzuschauen. Werde das gleich mal einarbeiten.

    Kann ich den die Methode GUIOnEventMode und GUIGetMsg miteinander kombinieren? Alle bisherigen Fensteraktionen habe ich mit GUIOnEventMode realisiert.

    Wenn Du's eilig hast - geh langsam...

  • Nein...
    Du kannst entweder nur den MessageLoop Mode oder den OnEvent Mode verwenden.
    Beides ist so zusammen nicht möglich.

    Hier als kleines Beispiel:

    [autoit]

    Opt('GUIOnEventMode', 1)

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

    $hGUI = GUICreate('')
    $id = GUICtrlCreateButton('', 0, 0, 100, 100)
    GUICtrlSetOnEvent($id, '_Exit')
    GUISetState()

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

    While GUIGetMsg() <> -3
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]