【发布时间】:2010-09-28 22:34:57
【问题描述】:
我有一个 Delphi Web 服务器,提供一些 Web 服务*。其中一个应该生成并返回 PDF 报告。
使用 QReport 完成 PDF 创建,然后使用 ExportToFilter 过程将其导出为 PDF 文件。
从应用程序中调用时,该例程工作正常,但在 TIdTCPServer 后面调用时,它挂起并且永远不会完成。调试它,我明白了:
(注意:我现在在家,没有源代码。我会尽量准确地重现 quickrpt.pas 的源代码)。 p>
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
AProgress := TQRFormProgress.Create(Application); // Hangs on this line
AProgress.Owner := QReport;
if ShowProgress then AProgress.Show;
QReport.Client := AProgress;
...
在网上搜索,我在this page(1)中找到了将ShowProgress设置为False的建议,并编辑代码使其在ShowProgress设置为false时不会创建进度表(显然,这是由于QReport 不是线程安全的)。
所以,我编辑了代码,现在我有了这个:
procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
...
if ShowProgress then
begin
AProgress := TQRFormProgress.Create(Application);
AProgress.Owner := QReport;
AProgress.Show;
QReport.Client := AProgress
end;
...
现在,报告出来了。但随后服务会出现无效指针异常(我无法跟踪)。对服务的调用成功完成,但是当我关闭服务**时,它又开始抱怨无效指针异常,然后是“MyServer 已提交无效操作,必须关闭”windows 消息,然后又是几次,然后只是指针异常,然后出现错误 216(据我所知,这与 Windows 访问权限有关)。
谢谢!
更新(1 月 5 日):感谢 Scott W. 的answer。确实,经过一番研究,我发现了另一个建议,即只有主线程可以访问某些组件。因此,我将 QR 码设置为正常,并从 TThread 内的 Synchronize 调用中调用 main 方法(这样主线程就会处理它)。但我仍然遇到同样的错误。
您提到您可以使用 QR 4 将 PDF 作为服务生成。也许这就是为什么它对我不起作用,因为我使用的是 QR 3。另一方面,您没有提到您是否正在做在 TIdTCPServer 后面(在我的情况下,提供 Web 服务)或者如果您自己运行它(例如,在批处理过程中)。
有人知道我的二维码版本是否有问题吗?谢谢!
* 在 Windows XP SP2 上运行 Delphi 7 和 QuickReport 3。服务器基于 Indy。
** 我有两个版本的服务器:一个 Windows 应用程序和一个 Windows 服务。两者调用相同的内部逻辑,两个版本都会出现问题。
更新(3 月 8 日):毕竟,我的问题是我的打印程序在另一个 dll 中,并且默认的内存管理模块有些糟糕。将我的 .dpr 的第一次使用设置为 ShareMem 会用 Borland 的实现覆盖内存管理模块,并解决了我的问题。
uses
ShareMem, ...
【问题讨论】:
-
我也在尝试从 Windows 服务生成 PDF。当我调用 QuickReport.Prepare 语句时,我的服务停止。没有错误信息。您如何从服务中生成快速报告?
标签: web-services delphi pdf-generation quickreports