Cursor während Drag&Drop (TargetControl)
Cursor während Drag&Drop (TargetControl)
Ich möchte auf meinem Formular nur auf einem bestimmten Control (TreeView oder Listbox) eine DropFiles-Aktion zulassen.
Das klappt auch sehr gut, indem ich im OnDropFiles einfach abfrage, ob sich das TargetControl unter der aktuellen CursorPos befindet.
Allerdings möchte ich auch, dass der Cursor während der DropAction sein Aussehen danach richtet, ob die Maus über einem 'zulässigen' Control ist, oder nicht. Also quasi unterscheidet zwischen einem TargetControl und allen anderen.
Leider wird nicht ein einziges Event während einer aktiven Drag&Drop-Aktion ausgelöst, weder OnMouseMove, noch OnDragOver oder sonstiges.
Wie kann ich während der DropAction ermitteln, wo sich gerade mein Cursor befindet und dann dementsprechend den Cursor ändern?
Das Einfachste wäre natürlich, wenn man einem Control ein AllowDropFiles zuweisen könnte, doch das ist ja leider auf das gesamte Formular beschränkt.
Das klappt auch sehr gut, indem ich im OnDropFiles einfach abfrage, ob sich das TargetControl unter der aktuellen CursorPos befindet.
Allerdings möchte ich auch, dass der Cursor während der DropAction sein Aussehen danach richtet, ob die Maus über einem 'zulässigen' Control ist, oder nicht. Also quasi unterscheidet zwischen einem TargetControl und allen anderen.
Leider wird nicht ein einziges Event während einer aktiven Drag&Drop-Aktion ausgelöst, weder OnMouseMove, noch OnDragOver oder sonstiges.
Wie kann ich während der DropAction ermitteln, wo sich gerade mein Cursor befindet und dann dementsprechend den Cursor ändern?
Das Einfachste wäre natürlich, wenn man einem Control ein AllowDropFiles zuweisen könnte, doch das ist ja leider auf das gesamte Formular beschränkt.
Re: Cursor während Drag&Drop (TargetControl)
Verwendung in WIN oder Linux?
Wenn es unter Windows verwendet wird, kannst du die Drag&Drop Suite im OPM verwenden.
Ich hatte mal einen Fork für Lazarus der Drag&Drop Suite von Andres Melander erstellt, welche nun im OPM bereitgestellt wird.
Damit kannst du unter Verwendung einer DropFileTarget Komponente auch einstellen, ob ein Image zum DragDrop Object angezeigt wird.
Für jedes "Target" verwendest du einfach ein "DropFileTarget"...
Wenn es unter Windows verwendet wird, kannst du die Drag&Drop Suite im OPM verwenden.
Ich hatte mal einen Fork für Lazarus der Drag&Drop Suite von Andres Melander erstellt, welche nun im OPM bereitgestellt wird.
Damit kannst du unter Verwendung einer DropFileTarget Komponente auch einstellen, ob ein Image zum DragDrop Object angezeigt wird.
Für jedes "Target" verwendest du einfach ein "DropFileTarget"...
Gruß, Michael
Re: Cursor während Drag&Drop (TargetControl)
Hallo Michael,
erst mal vielen Dank für Deinen Post.
Die 'Melander'-Komponenten habe ich momentan im Einsatz. Allerdings sollen keine Fremdkomponenten eingesetzt werden. Deshalb müssen diese wieder raus und das Problem mit Bordmitteln von Lazarus gelöst werden.
Übrigens entwickle ich derzeit nur für Windows.
Gruß, Jürgen
erst mal vielen Dank für Deinen Post.
Die 'Melander'-Komponenten habe ich momentan im Einsatz. Allerdings sollen keine Fremdkomponenten eingesetzt werden. Deshalb müssen diese wieder raus und das Problem mit Bordmitteln von Lazarus gelöst werden.
Übrigens entwickle ich derzeit nur für Windows.
Gruß, Jürgen
Re: Cursor während Drag&Drop (TargetControl)
Oha...
das war damals der Grund, warum ich die Melander Komponenten für Lazarus umgesetzt habe... ich hatte ähnliche Probleme und kam mit dem unflexiblen Drag&Drop von Lazarus einfach nicht weiter. Das war schon eine "Verzeweiflungstat" von mir, das umzusetzen
Insofern kann ich dir da nicht wirklich weiter helfen, wenn die Suite keine Alternative ist.

das war damals der Grund, warum ich die Melander Komponenten für Lazarus umgesetzt habe... ich hatte ähnliche Probleme und kam mit dem unflexiblen Drag&Drop von Lazarus einfach nicht weiter. Das war schon eine "Verzeweiflungstat" von mir, das umzusetzen

Insofern kann ich dir da nicht wirklich weiter helfen, wenn die Suite keine Alternative ist.
Gruß, Michael
Re: Cursor während Drag&Drop (TargetControl)
Trotzdem vielen Dank. Evtl. hat jemand anders eine zündende Idee.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Cursor während Drag&Drop (TargetControl)
Du kannst ControlAtPos(Mouse.CursorPos) verwenden.
Re: Cursor während Drag&Drop (TargetControl)
Das ist mir schon klar, dass ControlAtPos das betreffende Control zurückgibt, ich benutze es ja schon beim eigentlichen DropFiles-Event.
Das Problem, was ich lösen muss ist, dass WÄHREND des Drop-Vorganges (linke Maustaste ist gedrückt) das Formular keine Events auslöst, zumindest keine mir bekannten. Sobald man die linke Maustaste loslässt, gehen wieder alle Events.
Ich möchte aber gerade WÄHREND des 'Droppen' mittels verschiedener Cursor visualisieren, wo drop erlaubt ist und wo nicht. Genau dazu benötige ich irgendein Event.
Das Problem, was ich lösen muss ist, dass WÄHREND des Drop-Vorganges (linke Maustaste ist gedrückt) das Formular keine Events auslöst, zumindest keine mir bekannten. Sobald man die linke Maustaste loslässt, gehen wieder alle Events.
Ich möchte aber gerade WÄHREND des 'Droppen' mittels verschiedener Cursor visualisieren, wo drop erlaubt ist und wo nicht. Genau dazu benötige ich irgendein Event.
Re: Cursor während Drag&Drop (TargetControl)
Meinst du: währen des DRAG-ENS, also so lange der Anwender das Objekt über die Oberfläche zieht?zappa2 hat geschrieben:Ich möchte aber gerade WÄHREND des 'Droppen' mittels verschiedener Cursor visualisieren, wo drop erlaubt ist und wo nicht. Genau dazu benötige ich irgendein Event.
Gruß, Michael
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Cursor während Drag&Drop (TargetControl)
Normalerweise wird doch OnDragOver ausgelöst wenn man etwas über ein Control schiebt. Lässt man dann die Maus los, wird OnDragDrop ausgelöst.
Re: Cursor während Drag&Drop (TargetControl)
Ab hier ist nichts "normal". Beim Drag und Drop von Dateien wird der Vorgang von einem anderen Programm, in der Regel dem Explorer, ausgelöst. Die eigene Anwendung kriegt von dem Vorgang nicht einmal ein OnMouseMove oder ein OnDragOver mit, nur das onDropFiles. (Siehe beigefügtes Testprogramm, dass die MouseMove/DragOver events in einem Memor protokolliert, aber während des Drag&Drop aus dem Explorer stumm bleibt).fliegermichl hat geschrieben:Normalerweise wird doch OnDragOver ausgelöst wenn man etwas über ein Control schiebt. Lässt man dann die Maus los, wird OnDragDrop ausgelöst.
Um das zu fixen muss man tief in die systemweite Eventbehandlung einsteigen - oder man nimmt halt doch die Melander Suite.
- Dateianhänge
-
OnDropFiles.zip
- (2.16 KiB) 112-mal heruntergeladen