我使用Delphi XE5并且必须意识到用户可以将不同的文件(docx,xlsx,图片(jpeg,gif,...),电子邮件......)拖到组件中。组件应该显示电子邮件的文件名或标题。 我想将此文件保存到SQL-Server数据库中的Blob字段中。
任何人都可以通过一个简短的例子告诉我最好的可能性。 我可以用标准的delphi组件实现这一点,还是需要安装特殊组件。
答案 0 :(得分:2)
您的组件需要来自TWinControl
(TCustomControl
等),因此它有自己的HWND
来拖动内容。然后:
如果您只想捕获拖动的文件名,您的组件可以处理WM_DROPFILES
窗口消息。这是遗留消息,但它仍然有效。但是,它仅在将物理文件从文件系统拖到窗口时才有效。对于更高级的方案(拖动虚拟数据,从其他应用程序拖动数据等),您需要...
一个。改为实现IDropTarget
接口。编写一个实现IDropTarget
的对象,或使用第三方实现,例如来自Ander's Melander's Drag&Drop suite。
湾在创建组件HWND
之后使用RegisterDragDrop()
注册该对象(在组件的重写CreateWnd()
方法中执行此操作的最佳位置),并使用{{3注销对象当HWND
被销毁时(例如在重写的DestroyWnd()
方法中)。
℃。当用户在组件窗口中拖动某些内容时,将调用RevokeDragDrop()
实现。检查提供的IDropTarget.DragEnter()
以查看它是否包含您支持的数据格式+传输方案(一次可以有多个组合)。每个数据将由唯一的剪贴板格式标识符标识,并且IDataObject
值指示数据的传输方式。一些剪贴板格式是预定义的(参见TYMED
),有些可以在运行时动态注册(参见Shell Clipboard Formats)。如果您找到支持的组合,请返回DROPEFFECT_COPY
以接受拖动,否则返回DROPEFFECT_NONE
以拒绝拖动。
d。如果用户将某些内容放到您的组件窗口上(如果DragEnter()
接受),则会调用您的RegisterClipboardformat()
实现。从提供的IDataObject
中提取数据并根据需要使用它。删除物理文件时,您将收到路径+名称和/或其IDropTarget.Drop()
标识符,然后您可以根据需要打开和读取文件。删除虚拟数据/文件时,您将获得实际数据(通常将其作为HGLOBAL
中的一块内存传输,您可以使用ITEMIDLIST
或GlobalLock()
进行访问。界面,但还有其他可能性。)
有关详细信息,请参阅MSDN:
Transferring Shell Objects with Drag-and-Drop and the Clipboard