Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen (https://www.delphipraxis.net/211324-drag-drop-innerhalb-einer-delphi-komponente-und-von-nach-aussen.html)

himitsu 30. Aug 2022 10:01

Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Moin,

wie macht man am Besten Drag&Drop, innerhalb von einer Delphi-Komponente und von, sowie nach Außen?
(aktuell noch kompatibel zu Delphi XE, aber auch schon Delphi 11 und notalls muß es nicht mehr kompatibel sein ... sooo eilig ist es jetzt noch nicht)



Innerhalb von Delphi-Komponenten nutzt Delphi ja seinen eigenen Mist (TDragObject mit OnStartDrag/OnDragDrop).
-> Das wurde/wird hier seit Jahrzehnten genutzt, um Items (Dokumente) im einem Tree zu verschieben.

Dann wollte jemand Drag&Drop von außen (Explorer, Outlook Express und Thunderbird), also auf WM_DROPFILES reagiert.
-> Funktionierte problemlos.

Danach kam dann MSOffice-Outlook dazu, wo WM_DROPFILES nur bedingt geht,
also auf IDropTarget umgebaut ... das Selbsmachen nach 'ner Weile aufgegeben und aktuell DropMaster verwendet.
-> Ging auch.

Dann ging es los und jemand wollte Dokumente nicht nur rein, sondern auch raus.
-> Nur ging das nicht gleichzeitig, also entweder im Delphi gestartet oder nach außen.
-> Da das alte Umsortieren weiter funktionieren mußte, starte ich das Externe im OnMouseDown eines Buttons (Dokument im Baum auswählen und dann danaben einen "Button" nehmen und rausziehen).



Nur langsam (nach über 5 Jahren) fangen neue Kunden nun an rumzumosern, dass es ihnen so nicht wirklich gefällt, bzw. sie es nicht verstehen.
Delphi selber bietet natürlich nichts (außer der Drop-Komponente im FMX, was so in der VCL eh keine Lösung wäre, bzw. sie wäre ja genauso wie jetzt, mit dem Button, nur mit größerer Platzverschwendung, wenn es das in der VCL gäbe)



Beides gleichzeitig zu starten geht wirklich nicht? oder hatten wir damals nur was falsch gemacht?

Ansonsten bliebe doch bestimmt nun noch die Lösung im Tree auf IDropTarget/IDropSource/DoDragDrop umzustellen, auch für das Verschieben innerhalb der Delphi-Komponente.
Nur was ich vor Jahren da mal an Beispielen sah, ging immer nur von einer Source (eine Komponente) zu einem "anderen" Target (nicht die gleiche Komponente, an einem anderen X:Y).

Papaschlumpf73 30. Aug 2022 11:14

AW: Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Bei mir funktionieren diese hier ganz gut unter Delphi 10.4.2
Ergänzung: Allerdings nur i.V.m. externen Anwendungen eingesetzt; innerhalb der VCL nicht getestet.

unit DragDrop;
// -----------------------------------------------------------------------------
// Project: New Drag and Drop Component Suite
// Module: DragDrop
// Description: Implements base classes and utility functions.
// Version: 5.7
// Date: 28-FEB-2015
// Target: Win32, Win64, Delphi 6-XE7
// Authors: Anders Melander, anders@melander.dk, http://melander.dk
// Latest Version https://github.com/landrix/The-new-D...ite-for-Delphi
// Copyright © 1997-1999 Angus Johnson & Anders Melander
// © 2000-2010 Anders Melander
// © 2011-2015 Sven Harazim
// -----------------------------------------------------------------------------
// TODO -oanme -cPortability : Replace all public use of HWND with THandle. BCB's HWND <> Delphi's HWND.

mytbo 30. Aug 2022 14:04

AW: Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1511007)
Bei mir funktionieren diese hier ganz gut unter Delphi 10.4.2

Hier der gefixte Link zur aktualisierten Version auf GitHub.

Bis bald...
Thomas

himitsu 14. Sep 2022 09:48

AW: Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Nja, Problem ist nicht per se die D&D-Komponente.


Sondern dass ich hier Drag&Drop-Verschieben von Nodes in einem DevExpressTree mit Drag&Drop von und zu externen Programmen mischen muss will.


Rein zu kann man es ja noch unterscheiden, was wir bereits machen, weil unterschiedliche Schnittstellen angesprochen werden, ob der Drag im Tree begann oder von außen kommt und dort nur der eine oder andere Drop eintrifft. (aktuell nur im gesamten Tree, also in die aktuell selektierte Node und nicht in die Node, wo die Maus drauf steht)

Aber wenn man den Drop beginnt, dann kann man (scheinbar) jeweils nur Einwas starten, also, wie schon immer, entweder das Delphi-D&D für das Verschieben im Tree,
oder das Windows-D&D zum Schieben in andere Anwendungen. Daher wird das Windows-D&D aktuell aus einer gesonderten Zone (einem Button) gestartet,
weil mit Strg/Shift/Alt zu hantieren und darüber zu entscheiden, das versteht einfach niemand. Die hatten schon Probleme mit Strg/Shift/Alt für die Auswahl von Verlinken/Verchieben/Kopieren von Dateien in unser DMS, obwohl ich es genauso reagieren lasse, wie man es vom Explorer her kennt.
Bzw. wenn ich beides Starten würde/könnte, dann auch noch auspassen, weil ja dann der Tree auf Beides gleichzeitig reagiert (der Move und Drop vom Delphi-D&D und vom Windows-D&D, die auch gegeneinander um das Maus-Icon kämpfen)


Aktuell hätte ich noch die Idee, eventuell beim Move zu schauen, ob die Maus den Tree/Programm verlässt und dann das eine D&D abzubrechen und das Andere neu zu starten und bei zurück ins Fenster wieder umzukehren. :gruebel:

Papaschlumpf73 14. Sep 2022 10:26

AW: Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Zitat:

Zitat von himitsu (Beitrag 1511787)
Aktuell hätte ich noch die Idee, eventuell beim Move zu schauen, ob die Maus den Tree/Programm verlässt und dann das eine D&D abzubrechen und das Andere neu zu starten und bei zurück ins Fenster wieder umzukehren. :gruebel:

Klingt ziemlich umständlich. Mir fällt aber auch keine bessere Lösung ein. Es sei denn, wenn es (intern) wirklich nur um das Verschieben der Nodes im DevExpressTree geht, dass du jedes D&D-Ereignis innerhalb vom DevExpressTree wie ein externes verwendest und dann auch so die Nodes verschiebst und die internen D&D-Funktionen im DevExpressTree vollständig ignorierst. Keine Ahnung, ob das geht....

himitsu 14. Sep 2022 10:42

AW: Drag&Drop innerhalb einer Delphi-Komponente UND von/nach Außen
 
Jupp, ist alles irgendwie nicht so einfach. (mehrere Wege ... manuell oder automatisch, aber nichst leicht verständlich oder aktuell noch keine Ahnung wie es umgesetzt werden kann)

Zitat:

Zitat von Papaschlumpf73 (Beitrag 1511789)
Keine Ahnung, ob das geht....

Gehen muß es ja irgendwie ... der Explorer und Outlook machen es auch, also im Tree/Grid verschieben, aber auch rein und raus.
Oder die haben mir meine Idee gelaut und schalten um :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz