检查Delphi中的复制与移动拖放

时间:2009-08-18 20:46:40

标签: delphi drag-and-drop vcl

使用'标准'VCL拖放事件OnDragOver和OnDragDrop,如何区分“复制”和“移动”操作?

我似乎没有TDragType可用,并且键盘Shift状态不会传递给这些事件。

4 个答案:

答案 0 :(得分:8)

这不是您可以从事件中确定的事情,因为事件不会对您的应用程序需求或功能做出任何假设。

将特定拖放解释为具有任何特定语义是应用程序本身的责任 - 操作系统无法知道应用程序将如何对文件的删除做出反应,因此不能假设拖动操作可能意味着什么用户。

对于许多应用程序,复制/移动之间没有区别,只会拖放。

复制/移动区别是 Windows资源管理器适用于文件操作的内容。对于“vanilla”拖放,它会根据原始和目标驱动器卷应用规则 - 默认情况下,在卷上拖放文件是移动操作。默认情况下,在卷中拖放副本

但这些只是应用程序确定的默认规则(Windows资源管理器)。用户可以在拖动期间使用键盘快捷键覆盖这些默认值,并且(最重要的是)在删除时使用键盘快捷键。但这些是由特定应用程序定义和解释的 - 即 Windows资源管理器 - 而不是操作系统。

因此,如果您的应用程序是可以从 Windows资源管理器拖动的文件的放置目标,并且如果您的应用程序区分复制和移动是有意义的,那么您可能需要支持 Windows资源管理器支持的相同键盘修饰符。我不相信这些是可修改的(尽管我建议这一点得到确认),所以你可以简单地测试拖动事件中Ctrl或Shift键的状态:

Ctrl         = COPY
Shift        = MOVE
Ctrl + Shift = MAKE SHORTCUT  (if this is applicable to your application)

GetKeyState()可用于在任何给定时刻直接询问特定密钥的状态。

如果需要改变“默认”行为,那么您必须将自己的测试应用于源信息,以确定哪个默认最有意义(即模仿 Windows资源管理器< / em>“卷边界”默认规则),或者只是为您的应用选择最合适或直观的默认操作。

答案 1 :(得分:4)

简短的回答是 - 你没有。 VCL的内置拖放系统并没有区分两者。但是,您可以派生自己的TDragObject / Ex类来控制实际拖动的数据类型。

答案 2 :(得分:4)

如果你想在你的应用程序和其他Windows应用程序之间使用Drag'n'Drop,那么值得关注Anders Melander的Drag and Drop Component Suite for Delphi。 最新代码为here

答案 3 :(得分:0)

不确定特定于Delphi,但在C#中检查事件参数的AllowedEffect属性。由于它们都链接回Win32,我无法想象会有太大的不同。

http://msdn.microsoft.com/en-us/library/system.windows.forms.drageventargs.aspx有一个很好的例子。希望这有帮助!