【发布时间】: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