我正在将DAO应用程序从16位VB3更新为32位VB6(是的,现在是2014年,不要问..(使用 VB6 SP6 + Crystal Reports 软件包,该软件包随 VB6(版本 4.6(提供。
该应用程序具有生成报表的多个窗体。我对生成报告的每个表单都有水晶报告控件。
在我的开发机器中 - 它有所有正确的 CryRpt OCX 和 DLL - 报告有时可以工作,但在这种情况下我收到提到的错误:
-
打开表单 1 并打印内容
-
打开表单 2 并打印内容
-
关闭表格 2
-
返回到表单 1,当您尝试打印时,您会得到对象已与其客户端断开连接
-
如果打开窗体 2(或带有"晶体报告"控件的另一个窗体(,则在新窗体打开时,窗体 1 可能会再次开始打印
-
在所有这些打开和关闭的过程中,整个事情最终会崩溃并显示一条令人讨厌的 Windows 错误消息(包括 VB IDE(。
万事如意,佩德罗
我找到了一个解决方法,我想分享一下,以防其他人遇到这种情况。
看起来,您不能有多个带有Crystal Reports 4.6 OCX的表单。每个应用程序仅使用 1 个 OCX 实例。CR 4.6 似乎不能很好地处理 OCX 的加载和卸载,以及在打开和关闭包含 CR OCX 的多个表单时在幕后共享关联的 DLL。
我发现的解决方法是创建一个带有一个Crystal Reports OCX的表单。此表单始终加载但隐藏;每当我需要呈现报表时,应用程序中的所有表单都会使用/调用它。总之:
-
板条箱形式"prntHndlr"(或使用您想要的任何名称(并将水晶报告OCX放在上面。
-
在应用程序启动时加载此表单(但将其隐藏(
-
您需要在 frmPrntHndlr 中创建 1 个公共方法(例如"MyPrintReport"(来接收参数并打印报告(接收 RPT 文件路径、DB 路径、排序顺序、选择公式等(
每当我需要打印时,我都会调用prntHndlr.MyPrintReport(....(。该函数获取参数,将它们分配给 OCX,最后"显示"报表。
该功能可以根据需要多次调用。
当应用程序关闭时,需要由最后一个表单卸载表单。(其他明智的做法是,它实际上不会关闭并留在进程管理器中(。
像魅力一样工作!
我花了几个小时来追踪这个(谷歌没有帮助(,所以我认为与社区分享这个会很有用。
再一次,如果您知道任何解决方法或更好的方法来解决此问题,请告诉我
万事如意,佩德罗