我正在将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)。
一切顺利, 佩德罗
答案 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,最后"显示"报告。
可以根据需要多次调用该功能。
当应用程序关闭时,表单需要由最后一个表单卸载。 (另一方面,它赢得了实际关闭并留在流程经理中。)
像魅力一样!
花了我几个小时的时间来追踪这一点(没有谷歌的帮助)所以我认为与社区分享这个很有用。
如果你知道有任何解决方法或更好的方法来解决这个问题,请告诉我
一切顺利, 佩德罗