【问题标题】:Drag & Drop Delphi XE5拖放 Delphi XE5
【发布时间】:2016-02-03 21:46:38
【问题描述】:

我使用 Delphi XE5 并且必须意识到用户可以将不同的文件(docx,xl​​sx,图片(jpeg,gif,...),电子邮件,...拖到一个组件中。组件应该显示电子邮件的文件名或标题。 比我想将此文件保存到 SQL-Server 数据库中的 Blob 字段中。

如果可能的话,谁能通过一个简短的例子告诉我最好的可能性是什么。 我可以用标准的delphi组件实现这一点还是需要安装特殊的组件。

【问题讨论】:

    标签: delphi drag-and-drop delphi-xe5


    【解决方案1】:

    您的组件需要从TWinControlTCustomControl 等)派生,因此它有自己的HWND 可以拖到上面。那么:

    1. 如果您只想捕获拖动的文件名,您的组件可以处理WM_DROPFILES 窗口消息。这是一条旧消息,但它仍然有效。但是,它仅在将物理文件从文件系统拖到您的窗口时才有效。对于更高级的场景(拖动虚拟数据、从其他应用拖动数据等),您需要...

    2. 一个。改为实现IDropTarget 接口。编写实现IDropTarget 的对象,或使用第三方实现,例如来自Ander's Melander's Drag&Drop suite

      b.在创建后使用RegisterDragDrop() 为组件的HWND 注册该对象(在组件的覆盖CreateWnd() 方法中执行此操作的最佳位置),并在HWND 为时使用RevokeDragDrop() 取消注册该对象被销毁(例如在被覆盖的DestroyWnd() 方法中)。

      c。当用户将某些东西拖到您的组件窗口上时,您的 IDropTarget.DragEnter() 实现将被调用。检查提供的 IDataObject 以查看它是否包含您支持的数据格式 + 传输方案(一次可以有多个组合)。每条数据都将由一个唯一的剪贴板格式标识符和一个TYMED 值标识,该值指示数据的传输方式。一些剪贴板格式是预定义的(参见Shell Clipboard Formats),还有一些可以在运行时动态注册(参见RegisterClipboardformat())。如果找到支持的组合,返回DROPEFFECT_COPY接受拖拽,否则返回DROPEFFECT_NONE拒绝拖拽。

      d。如果用户将某些东西放到您的组件窗口上(如果被DragEnter() 接受),您的IDropTarget.Drop() 实现将被调用。从提供的IDataObject 中提取数据并根据需要使用它。删除物理文件时,您将收到它们的路径+名称和/或它们的ITEMIDLIST 标识符,然后您可以根据需要打开和读取文件。删除虚拟数据/文件时,您将获得实际数据(通常作为HGLOBAL 中的一块内存传输,您可以使用GlobalLock()IStream 接口访问,但还有其他可用的可能性)。

    有关详细信息,请参阅 MSDN:

    Transferring Shell Objects with Drag-and-Drop and the Clipboard

    Shell Data Object

    Handling Shell Data Transfer Scenarios

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多