Crystal Reports 4.6和臭名昭着的自动化错误-2147417848调用的对象已与其客户端断开连接

时间:2014-12-10 05:20:47

标签: crystal-reports vb6

我正在将DAO应用程序从16位VB3更新为32位VB6(是的,它是2014年,请不要......) 使用VB6(版本4.6)附带的VB6 SP6 + Crystal Reports包。

该应用程序有多种表单可以生成报告。我在每个生成报告的表单上都有一个Crystal Reports控件。

在我的开发机器中 - 它具有CryRpt的所有正确的OCX和DLL - 报告有时工作但我在这种情况下得到了提到的错误:

  • 打开表单1并打印

  • 打开表单2并打印

  • 关闭表格2

  • 返回表单1,当您尝试打印时,您的对象已与其客户端断开连接

  • 如果您重新打开表单2(或其上带有Crystal Reports控件的其他表单),则表单1 可能在新表单打开时再次开始打印

  • 在所有这些打开和关闭的过程中,整个事情最终崩溃了一个令人讨厌的Windows错误消息(包括VB IDE)。

一切顺利, 佩德罗

1 个答案:

答案 0 :(得分:4)

我找到了一个可以分享的工作,以防其他人遇到此问题。

看起来, 可能有多个表格与Crystal Reports 4.6 OCX。每个应用程序仅使用1个OCX实例。 当打开和关闭具有CR的OCX的多个表单时,CR 4.6似乎无法很好地处理OCX的加载和卸载以及在幕后共享相关的DLL。

我找到的工作是创建一个单独的表单,其上有一个Crystal Reports OCX。 此表单始终加载但隐藏;每当我需要呈现报告时,应用程序中的所有表单都会使用/调用它。 简而言之:

  • Crate Form" prntHndlr" (或使用您想要的任何名称)并将Crystal Reports OCX放在其上。

  • 在应用程序启动时加载此表单(但隐藏它)

  • 您需要在frmPrntHndlr中创建一个公共方法(例如" MyPrintReport")以接收参数并打印报告(接收RPT文件路径,DB路径,排序顺序,选择公式等。 )

每当我需要打印时,我都会调用prntHndlr.MyPrintReport(....)。 该函数接受参数,将它们分配给OCX,最后"显示"报告。

可以根据需要多次调用该功能。

当应用程序关闭时,表单需要由最后一个表单卸载。 (另一方面,它赢得了实际关闭并留在流程经理中。)

像魅力一样!

花了我几个小时的时间来追踪这一点(没有谷歌的帮助)所以我认为与社区分享这个很有用。

如果你知道有任何解决方法或更好的方法来解决这个问题,请告诉我

一切顺利, 佩德罗