Delphi在复制到Windows剪贴板时出现问题

Delphi在复制到Windows剪贴板时出现问题,windows,delphi,delphi-xe2,clipboard,Windows,Delphi,Delphi Xe2,Clipboard,我们目前有几个客户报告说,我们的Delphi XE2 Win32应用程序中的“复制到剪贴板”功能不起作用,之后粘贴到Excel会导致粘贴旧的剪贴板内容 我们只是使用剪贴板.AsText复制类似CSV的文本,并添加了一些调试,以确保在构建CSV字符串的例程中不会出现无声崩溃。它周围没有异常处理,所以任何异常都应该显示给用户(没有报告) 以前有人遇到过类似的情况吗?如果有,最好的解决方案是什么?我注意到,在C#land中,根据默认行为,重试10次,延迟100毫秒。除非将该行为写入WinAPI,否则D

我们目前有几个客户报告说,我们的Delphi XE2 Win32应用程序中的“复制到剪贴板”功能不起作用,之后粘贴到Excel会导致粘贴旧的剪贴板内容

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

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

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

由于缺少代码的注释(我最初没有放任何注释,因为实际上没有任何注释)-伪代码实现是

Data := BuildCSVString();
Clipboard.AsText := Data;
StatusBar.Caption := 'Data copied to clipboard';
因此,失败的可能性不大

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


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

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

此外,由于Windows Vista,如果Delphi应用程序以管理员身份运行,没有管理权限运行的应用程序可能无法访问剪贴板上的数据。@StijnSanders这是我不知道的。抱歉,没有理由用管理员权限运行我们的应用程序,但我在两周前才继承了这个代码库,所以需要检查一下。我将在明天的站立会议上询问。@StijnSanders如果这是问题,那么它将永远不会工作-我认为它不会是间歇性的。
TClipboard.AsText
setter应该在数据无法放在剪贴板上时引发异常。话虽如此,请注意D2009+中的
AsText
使用
CF\u UNICODETEXT
格式作为文本数据,但CSV数据应使用
CFSTR\u CSV
格式(使用
RegisterClipboardFormat('CSV')
在运行时获取格式ID)。另外,Excel对CSV数据的编码有点特别。它应该是UTF-8格式,而不是UTF-16格式(您必须使用
TClipboard.SetAsHandle()
),当单元格分隔符使用tab,行分隔符使用LF时,Excel工作得更好。您可以(也应该)在剪贴板上同时使用多种格式,因此,您可以同时将
CF_UNICODETEXT
CFSTR\u CSV
放在剪贴板上,让Excel(或任何其他电子表格应用程序)决定要使用的格式。Excel还支持XML电子表格格式。没有代码很难调试。您有一个内部用户报告了故障(需要重试),听起来您的代码中确实存在错误。您确定代码在所有情况下都在实际执行吗?可能是因为焦点问题,您没有捕捉到键盘命令-我们怎么知道?只有您可以调试代码。我将从您可重现的内部用户问题开始—设置远程调试会话,看看会发生什么看起来像什么?你怎么知道它不是在重建一个旧字符串呢?它在一个表上迭代并构建一个CSV。为了解决这个问题,它也可以是一个字符串常量或返回一组随机字符。我可以保证这不是问题所在,因为它可以在其他人的机器上工作,也不是那种可以在一台机器上工作但不能在其他机器上工作的代码