Drag & Drop auf AutoIt-Button

  • Hallo zusammen,

    ich würde gerne Dateien an mein AutoIt-Script per Drag&Drop übergeben und zwar indem ich die Dateien auf einen Button ziehe. Hat das hier schon mal einer programmiert und kann mir sagen, wie das geht?

    Danke,

    Ghostbuster

    Einmal editiert, zuletzt von ghostbuster (8. Juli 2009 um 16:49)

  • Schau Dir in der Hilfe mal das Beispielscript zu "GUICtrlCreateInput" an. Dort ist das beschrieben.

    Ja, das hab ich. Danke für den Hinweis.

    In dem Beispiel erfolgt "Drag&Drop" aber nicht auf einen Button (wie gefragt), sondern auf ein Texteingabefeld. Das ist doch etwas anderes, oder steh ich grad auf der Leitung??? Bei einem Button kann ich die Dateipfade ja nicht einfach als Beschriftung des Buttons übernehmen, falls das überhaupt funktioniert. Hier würde man die übergebene Datei(-liste) direkt in eine Datei schreiben oder in einer Variablen speichern, um sie dann weiter zu verarbeiten; nur wie komme ich an die Dateiliste, wenn ich kein Eingabefeld habe, welches ich auslesen kann?

    Grüße

    Ghostbuster

    • Offizieller Beitrag

    Ich weiss ja nicht, was es für einen Sinn hat, eine Datei gerade auf einen Button zu ziehen, aber wenn Du unbedingt willst:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt('MustDeclareVars', 1)

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

    Example()

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

    Func Example()
    Local $file
    GUICreate(" My GUI input acceptfile", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
    $file = GUICtrlCreateButton("test", 10, 5, 300, 40)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUISetState()
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_DROPPED
    MsgBox(4096, "drag drop file", @GUI_DRAGFILE)
    EndSwitch
    WEnd
    EndFunc ;==>Example

    [/autoit]
  • Hi Oscar,

    vielen Dank für diesen Tipp. Ich bekomme allerdings immer nur eine Datei, auch wenn ich mehrere Dateien per Drag&Drop rüberziehe. Was mache ich falsch?

    Ghostbuster

    PS: Ich denke schon, dass es Sinn macht, Drag&Drop auf einen Button vorzunehmen. Stell Dir einfach vor, dass durch Klicken auf den Button sich die Dateiauswahlbox öffnet. Da wäre es doch nett, wenn man die gewünschten Dateien alternativ auch auf den betreffenden Button ziehen könnte, oder nicht?

    Einmal editiert, zuletzt von ghostbuster (7. Juli 2009 um 12:23)

    • Offizieller Beitrag

    Verstehe den Sinn deines Anliegens nicht wirklich. Warum willst du mehrere Dateien auf einen Button ziehen . Wäre da ein Edit oder eine Listbox nicht besser? Und wenn du mehrere Files auf einen Button ziehst, dann würden nur die Dateinamen dort angezeigt, was wieder eine Größenanpassung vorraussetzen würde .

    • Offizieller Beitrag

    Wenn Du auch mehrere zulassen willst, dann musst Du das so ändern:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <GUIConstantsEx.au3>

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

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

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

    GUICreate(" My GUI acceptfile", 320, 120, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
    $file = GUICtrlCreateButton("test", 10, 5, 300, 40)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUISetState()
    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_DROPPED
    _ArrayDisplay($gaDropFiles)
    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 255)
    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
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit]

    Trotzdem finde ich das ziehen von Dateien auf einen Button "komisch". Eigentlich zieht man Dateien doch dorthin, wo sie dann angezeigt werden sollen und nicht auf irgendeinen Button. :S

  • Danke Oscar, das ist es.

    Grüße Ghostbuster

    PS: Ich denke, dass man Drag & Drop in vielen Kontexten intuitiv verwenden kann, insbesondere zur Erzeilung einer optimalen Interoperabilität mit anderen Anwendungen. Dass dabei mehr als eine Datei verwendet wird, ist nichts Ungewöhnliches - im Gegenteil. Man denke nur an das Kopieren von mehreren Dateien von einem Ordner in einen anderen via graphischer Benutzeroberfläche. Drag&Drop auf einen Button ist - zugegeben - etwas ungewöhnlich aber nicht minder sinnvoll, da der Button einen ofensichtlichen Kontext für die Operation definiert. Drag&Drop auf einen Button ist dann eine bequeme Alternative, wenn der Button beim Klicken ohnehin die Dateiauswahlbox öffnet, um mehrere Dateien für eine Operation auszuwählen. Dabei muss der Zielort der Operation (der Button) nicht unbedingt das Anzeigen, was "gedragged" wurde. Das kommt zwar oft vor, muss aber keineswegs zwingend so sein - finde ich.