【问题标题】:Delphi issues copying to Windows clipboardDelphi 问题复制到 Windows 剪贴板
【发布时间】:2015-11-19 10:35:08
【问题描述】:

我们目前有几个客户报告说我们在 Delphi XE2 Win32 应用程序中的复制到剪贴板功能无法正常工作,之后粘贴到 Excel 会导致粘贴旧的剪贴板内容。

我们只是使用Clipboard.AsText 复制类似 CSV 的文本,并添加了一些调试以确保我们在构建 CSV 字符串的例程中不会出现无声崩溃。它周围没有异常处理,所以任何异常都应该只显示给用户(没有报告)。

以前有没有人遇到过这样的事情,如果有,最好的解决方案是什么?我注意到在 C#-land 中,根据How to handle blocked Clipboard and other oddities,默认行为是重试 10 次,延迟为 100 毫秒。除非将该行为写入 WinAPI,否则 Delphi 包装器似乎不会这样做?

我认为这是用户机器问题,而不是我们的应用程序中的问题,尽管他们显然没有在其他软件中遇到过这种情况。在内部,我们有一个用户的第一个 Ctrl-C 失败,但第二个成功(相当可靠),尽管测试超过 5 台其他机器没有显示任何结果。

由于 cmets 缺少代码(我最初没有放任何代码,因为那里什么都没有) - 伪代码实现是

Data := BuildCSVString();
Clipboard.AsText := Data;
StatusBar.Caption := 'Data copied to clipboard';

所以失败的余地不大。

用户看到状态栏 GUI 更新,因此剪贴板例程正在运行。报告是剪贴板保持不变,而不是被清除,因此 BuildCSVString 例程也没有失败并返回“”。

在这里构建可重现的代码的空间不大(否则我现在可能已经修复了它),我只是想知道是否有其他人遇到过这个问题以及解决它的最佳方法。

【问题讨论】:

  • 没有代码很难调试。您有一个报告失败(需要重试)的内部用户听起来您的代码中确实存在错误。你确定代码在所有情况下都在执行吗?也许您因为焦点问题而没有捕捉到键盘命令 - 我们怎么知道?只有您可以调试您的代码。我将从您可重现的内部用户的问题开始 - 设置一个远程调试会话,看看会发生什么。
  • 那么BuildCSVString(); 是什么样的?你怎么知道它不是在重建旧字符串?
  • 它遍历一个表并构建一个 CSV。为了这个问题,它也可能是一个字符串常量或返回一组随机字符。我可以保证这不是问题,因为它可以在其他所有人的机器上运行,而且它不是那种可以在一台机器上运行但不能在其他机器上运行的代码

标签: windows delphi delphi-xe2 clipboard


【解决方案1】:

在 Excel 出现故障后立即让用户粘贴到记事本中,从而排除 Excel。这将告诉您复制数据是否有问题,或者 Excel 是否在粘贴数据时遇到问题。或者,如果存在混合剪贴板问题,数据以多种格式显示在剪贴板上,来自不同来源(可能发生)。

【讨论】:

  • 另外,从 Windows Vista 开始,如果 Delphi 应用程序以管理员身份运行,剪贴板上的数据可能无法被非管理员权限的应用程序访问。
  • @StijnSanders 这是我不知道的。 AFAIK 没有理由以管理员权限运行我们的应用程序,但我只是在 2 周前继承了这个代码库,所以需要检查一下。我会在明天的站立会议上问。
  • @StijnSanders 如果这是问题所在,那么它永远不会起作用 - 我应该认为它不会是间歇性的。
  • 如果数据不能放在剪贴板上,TClipboard.AsText 设置器应该引发异常。话虽如此,请注意 D2009+ 中的 AsText 对文本数据使用 CF_UNICODETEXT 格式,但 CSV 数据应改为使用 CFSTR_CSV 格式(使用 RegisterClipboardFormat('Csv') 在运行时获取格式 ID)。此外,Excel 对 CSV 数据的编码有一点讲究。它应该是 UTF-8 而不是 UTF-16(您必须为此使用 TClipboard.SetAsHandle()),并且当使用制表符作为单元格分隔符并使用 LF 作为行分隔符时,Excel 效果更好。
  • 您可以(并且应该)同时在剪贴板上有多种格式,因此您可以同时将CF_UNICODETEXTCFSTR_CSV 放在剪贴板上,并让 Excel(或任何其他电子表格应用程序)决定它要使用哪种格式。 Excel 还支持 XML 电子表格格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多