Rod*_*ddy 4 delphi vcl drag-and-drop
使用'标准'VCL拖放事件OnDragOver和OnDragDrop,如何区分"复制"和"移动"操作?
我似乎没有可用的TDragType,并且键盘Shift状态不会传递给这些事件.
这不是您可以从事件中确定的内容,因为事件不会对您的应用程序需求或功能做出任何假设.
将特定拖放解释为具有任何特定语义是应用程序本身的责任 - 操作系统无法知道应用程序将如何对文件的删除作出反应,因此不能假设拖动操作可能对用户意味着什么.
对于许多应用程序,复制/移动之间没有区别,只会拖放.
复制/移动区别是Windows资源管理器应用于文件操作的内容.对于"vanilla"拖放,它会根据原始和目标驱动器卷应用规则 - 默认情况下,在卷上拖放文件是一个移动操作.默认情况下,跨卷拖放是一个副本.
但这些只是应用程序确定的默认规则(Windows资源管理器).用户可以在拖动期间使用键盘快捷键覆盖这些默认值,并且(最重要的是)在删除时使用键盘快捷键.但这些是由特定应用程序定义和解释的 - 即Windows资源管理器 - 而不是操作系统.
因此,如果您的应用程序是可以从Windows资源管理器拖动的文件的放置目标,并且如果您的应用程序区分复制和移动是有意义的,那么您可能需要支持Windows资源管理器支持的相同键盘修饰符.我不相信这些是可修改的(虽然我建议这一点得到确认),所以你可以简单地测试拖动事件中Ctrl或Shift键的状态:
Ctrl = COPY
Shift = MOVE
Ctrl + Shift = MAKE SHORTCUT (if this is applicable to your application)
Run Code Online (Sandbox Code Playgroud)
GetKeyState()可用于在任何给定时刻直接询问特定键的状态.
如果需要改变"默认"行为,那么您必须将自己的测试应用于源信息以确定哪个默认值最有意义(即模仿Windows资源管理器 "卷边界"默认规则),或者只需选择最合适的或直观的应用程序默认操作.
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |