Einzelnen Beitrag anzeigen

Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
880 Beiträge
 
Delphi 11 Alexandria
 
#1

Drag&Drop innerhalb eines VirtualTree und in den Explorer

  Alt 29. Dez 2021, 22:40
Ich bin grade dabei, in Sachen Drag&Drop etwas aufzuräumen.

Folgende Situation: Ich habe mehrere VirtualStringTrees in meiner Anwendung, die eine logische Sortierung von Dateien abbilden. D.h. die Dateien sind nicht nur entsprechend ihrer Ordnerstruktur auf der Festplatte organisiert, sondern auch nach anderen Kriterien, z.B. nach vom User definierbaren "Kategorien".

Ich möchte nun
  1. Die Dateien innerhalb meiner Anwendung per Drag&Drop umsortieren. Dabei möchte ich dem User die Möglichkeit haben, Dateien in eine andere Kategorie zu kopieren oder zu verschieben.
  2. Einzelne Dateien aus meiner Anwendung heraus in einen neuen Ordner auf der Festplatte kopieren (und nur kopieren, nicht verschieben!)

Einzeln betrachtet macht mir das keine Probleme - aber die Kombination ärgert mich irgendwie.

Wenn ich das richtig sehe, wird ja beim Beginn der OLE-Drag&Drop-Operation von der Quelle festgelegt, welche Operationen (DROPEFFECT_COPY bzw. DROPEFFECT_MOVE) erlaubt sind. D.h. es gibt keine Möglichkeit festzulegen, dass innerhalb der eigenen Anwendung ein MOVE erlaubt ist, aber nach außen nur ein COPY? Denn zu Beginn vom Drag steht das Ziel ja noch nicht fest ...

Die einzige Möglichkeit die ich sehe wäre, beim Start z.B. die gedrückte CTRL-Taste abzufragen und dementsprechend ein MOVE zu erlauben oder nicht. D.h. ohne Ctrl Copy/Move aber nur intern, mit Ctrl nur Copy, aber auch nach extern.

Das intern/extern würde ich über die passenden VST-Events regeln. Ich nutze jetzt für den Drop nach außen nicht mehr die sonst überall verlinkten Drag&Drop-Komponenten, sondern mache das selbst (mit großer Hilfe vom VST, versteht sich). Denn wenn ich im OnStartDrag des VST die DragDrop-Komponente fülle und execute aufrufe, dann kommen am Ende unter Umständen zwei Drop-Events im VST an - eine vom VST, und dann die von der DragDrop-Komponente (oder umgekehrt, auf jeden Fall führt das zu einem komischen Verhalten).

D.h. im VST.OnGetUserClipboardFormats füge ich je nach Status der CTRL-Taste (oder rechte Maustaste?) das Format CF_HDROP ein oder nicht (und setze ggf. einschränkend VST.DragOperations := [doCopy]; ), und im VST.OnRenderOLEData befülle ich das entsprechende DatenObjekt mit den Dateinamen der markierten Dateien.

Im OnDrop innerhalb der Anwendung nutze ich dann primär das interne Format (bzw. greife auf meine TDatei-Objekte zu), und ändere das Verhalten ggf., wenn auch CF_HDROP als Format vorhanden ist. Damit ist der Standard-Fall (Drag&Drop innerhalb der Anwendung) intuitiv bedienbar, und das Bonus-Feature (nur selten gebraucht) mit dem Drop in den Explorer ist mit nur einem zusätzlichen Tastendruck machbar.

Oder gibt es da eine andere Möglichkeit, die ich übersehen habe?
The angels have the phone box.
  Mit Zitat antworten Zitat