【问题标题】:DragDrop between two FMX applications在两个 FMX 应用程序之间拖放
【发布时间】:2020-08-02 13:24:32
【问题描述】:

您好,我需要将图像从一个应用程序拖到另一个应用程序。两者都是 Delphi FMX 应用程序。我在一个应用程序中成功地做到了,但现在需要在两个单独的应用程序之间传输,即没有内存共享。我很乐意将所有信息保存到文件中并在操作中传输文件名。我确实在接收应用程序中检测到 dragover 事件,但 data 属性为 nil,我不知道如何用有用的值填充它。 我正在使用 Windows 10,Delphi XE10.3 任何示例,解释都会有所帮助 谢谢

【问题讨论】:

  • 执行此操作的正确方法是 OLE 拖放。不需要(或不需要)中间文件。
  • 这样您甚至可以将图像从 Web 浏览器或 Microsoft Office 应用程序拖到您的应用程序中,反之亦然。

标签: delphi drag-and-drop firemonkey


【解决方案1】:

你找到答案了吗?

我正在尝试类似的东西。 Andreas 对正确的 OLE 的看法是正确的,但在 FireMonkey 中实施将需要大量工作。

问题在于 Windows 上的 FireMonkey 只能解释文件的外部拖动(通过它们的名称和路径)或 unicode 文本。它可以接受其他外部拖动,但不提取任何信息,因此无用。

查看 FMX.Platform.Win。 TWinFropTarget.GetDataObject() 是罪魁祸首。 PlatformWin.FDragAndDropActive 对于内部拖动为 true,对于外部拖动为 false。 仅解释 CF_HDROP(文件名)和 CF_UNICODETEXT(unicode 文本)的外部拖动。

实施自己的步骤将是

  1. 滚动您自己的 IDropTarget。
  2. 在 Windows 中注册。参见 TPlatformWin.CreateWindow(),调用 RegisterDragDrop()
  3. 创建一个释放它的机制,这就是 TWinWindowHandle.FWinDropTarget 所做的一切,但 FWinDropTarget 是私有的。
  4. 将它连接到将接收 drop 的表单或组件。
  5. 增强 GetDataObject 或您决定的任何替代,以解释感兴趣的外部拖动。这需要更多的研究。

以上一般涵盖接收方。

发送者需要进一步研究如何在 Windows 中初始化感兴趣内容的拖放。

根据需要对其他平台重复!

VCL 的拖放组件套件,https://torry.net/pages.php?id=233,可能有很多代码可以做到这一点,虽然我没有看过。

如果有人尝试这个,请更新这个帖子。

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
  • 对不起,Jmb,但我不同意。问题是如何在两个 Delphi FMX 应用程序之间拖放图像。安德烈亚斯的回答只是一个概念。我的回答是在 Delphi FMX 中实施 Andreas 的概念的步骤,因此是对这个问题的回答。如果我的帖子没有回答这个问题,那么安德烈亚斯的回答就是错误的。 (但我认为 Andreas 是对的。)
【解决方案2】:

Andreas 和我的答案是关于拖动图像本身。在问题中,您建议发送文件名是可以接受的。经过进一步研究以解决我自己的问题,我可以为您提供此解决方案的明确答案,这样可以避免工作量大大减少。

如您所知,拖放涉及源、目标和数据。

Fire Monkey Drag Drop 用于内部拖动(即在应用程序内)的实现使用自己的数据格式,即数据记录。对于内部拖动,仅填充 Data.Source 属性。

对于外部拖动(即应用程序之间,无论是否为 FMX)OLE 必须用于数据。

所有打开的应用程序都可以接收所有拖动。但是除非源设置了 OLE 数据,否则目标将无法解释拖动是什么或它来自哪里。您的问题指出“我确实在接收应用程序中检测到拖动事件,但数据属性为零”。您正在经历我所描述的情况。

Delphi FMX 将解释和解码收到的文件和文本内容的 OLE 数据。文件是带有路径的文件名列表,而不是文件本身。其他 OLE 内容将被忽略,例如图像。请参阅我之前的回答,了解如何增强 FMX 以解释其他 OLE 内容。

Delphi FMX 不设置 OLE 数据。因此,要实现从 Fire Monkey 应用程序拖放到另一个应用程序,包括另一个 Fire Monkey 应用程序,您必须编写自己的启动拖动代码来填充 OLE 数据。在我之前的回答中,这更简短地写为“发件人需要更多研究来了解如何在 Windows 中初始化感兴趣内容的拖放。”

此类 Drag Start 代码将从 Source 控件的 OnMouseDown 事件中调用。对于 Windows,我认为

  • 创建一个 COleDataSource
  • 设置数据
  • 调用它的 DoDragDrop 方法

我没有尝试过,因为我的应用程序不会成为应用程序间拖动的来源。

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2013-03-02
    相关资源
    最近更新 更多