Drag&Drop »»» auch für Anfänger geeignet (mit Anleitung)
Verfasst: 15.01.2007 21:34
Hallo!
Habe in mein Programm eine Drag&Drop Funktion eingebaut, die ich auch nicht vorenthalten möchte. Das Besondere: Ich habe den Code gut dokumentiert, man könnte sagen, an den Kommentierungen habe ich länger gesessen, als an dem Code.
Das Tolle daran: Es funktioniert sogar (Tests erfolgreich).
Außerdem habe ich die Prozedur so einfach gehalten, dass man als Parameter nur eine selbst definierte LinkedList des Typs "String" übergeben muss; der Rückgabewert ist die Anzahl tatsächlich gedroppter Dateien.
Benutzung:
Habe in mein Programm eine Drag&Drop Funktion eingebaut, die ich auch nicht vorenthalten möchte. Das Besondere: Ich habe den Code gut dokumentiert, man könnte sagen, an den Kommentierungen habe ich länger gesessen, als an dem Code.

Das Tolle daran: Es funktioniert sogar (Tests erfolgreich).

Außerdem habe ich die Prozedur so einfach gehalten, dass man als Parameter nur eine selbst definierte LinkedList des Typs "String" übergeben muss; der Rückgabewert ist die Anzahl tatsächlich gedroppter Dateien.
Benutzung:
- 1. Schritt:
Definiere eine LinkedList vom Typ String und mach dein Fenster Drag&Drop fähig, das geht so:Dies kannst du jederzeit wiederrufen, indem du '#False' einsetzt. Dann kann man keine Dateien mehr auf dein Fenster ziehen. Du kannst dies so oft tun, wie du möchtest.Code: Alles auswählen
NewList GedroppteDateien.s() DragAcceptFiles_(WindowID(#Mein_Fenster), #True)
- 2. Schritt:
Reagiere auf die Nachricht '#WM_DROPFILES'. Wenn WindowEvent() oder WaitWindowEvent() die Nachricht '#WM_DROPFILES' zurückgibt, musst du die Procedure aufrufen, die ich unten gepostet habe. Übergebe dieser Prozedur die LinkedList, die du definiert hast! Die Prozedur übernimmt dann alle weitere Arbeit.Code: Alles auswählen
Repeat If WaitWindowEvent() = #WM_DROPFILES getDroppedFiles(GedroppteDateien()) EndIf ForEver
- 3. Schritt:
Freuen! Denn nun enthält deine LinkedList alle Dateien, die auf den Fenster gezogen wurden. Diese LinkedList kannst du beispielsweise mit ForEach/Next durchblättern und debuggen. Die Procedure, die ich unten poste, gibt übrigens auch die Anzahl gedroppter Dateien zurück, falls benötigt.
Code: Alles auswählen
Procedure.l getDroppedFiles(List.s())
ClearList(List()) ; delete old files
Protected *hDrop=EventwParam() ; get drop-handle
Protected numDrop=DragQueryFile_(*hDrop, $FFFFFFFF, 0, 0) ; get amount of dropped files
Protected n, filenameLen, buffer$
For n=0 To numDrop-1
filenameLen=DragQueryFile_(*hDrop, n, 0, 0) ; get length of the current file name
If filenameLen
buffer$=Space(filenameLen+1) ; prepare needed buffer (manually calculate terminating null!)
DragQueryFile_(*hDrop, n, @buffer$, filenameLen+1) ; transfer current filename into buffer
AddElement(List()) ; transfer filename from buffer to linked list
List()=buffer$
EndIf
Next
DragFinish_(*hDrop) ; release memory used by the drag&drop function
ProcedureReturn CountList(List()) ; return amount of files dropped
EndProcedure