使用'标准'VCL拖放事件OnDragOver和OnDragDrop,如何区分“复制”和“移动”操作?
我似乎没有TDragType可用,并且键盘Shift状态不会传递给这些事件。
答案 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有一个很好的例子。希望这有帮助!