Cursor während Drag&Drop (TargetControl)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Cursor während Drag&Drop (TargetControl)

Beitrag von zappa2 »

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.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von six1 »

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"...
Gruß, Michael

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von zappa2 »

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

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von six1 »

Oha... :mrgreen:
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 :lol:
Insofern kann ich dir da nicht wirklich weiter helfen, wenn die Suite keine Alternative ist.
Gruß, Michael

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von zappa2 »

Trotzdem vielen Dank. Evtl. hat jemand anders eine zündende Idee.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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)

Beitrag von fliegermichl »

Du kannst ControlAtPos(Mouse.CursorPos) verwenden.

zappa2
Beiträge: 43
Registriert: Do 28. Nov 2013, 09:54

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von zappa2 »

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.

Benutzeravatar
six1
Beiträge: 782
Registriert: Do 1. Jul 2010, 19:01

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von six1 »

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.


Meinst du: währen des DRAG-ENS, also so lange der Anwender das Objekt über die Oberfläche zieht?
Gruß, Michael

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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)

Beitrag von fliegermichl »

Normalerweise wird doch OnDragOver ausgelöst wenn man etwas über ein Control schiebt. Lässt man dann die Maus los, wird OnDragDrop ausgelöst.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Cursor während Drag&Drop (TargetControl)

Beitrag von wp_xyz »

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.

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).

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) 102-mal heruntergeladen

Antworten