【问题标题】:Generating PDF with Quick Reports behind a Delphi Web Server在 Delphi Web 服务器后面使用快速报告生成 PDF
【发布时间】: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, ...

(1):http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.thirdpartytools.general/2006-09/msg00013.html

【问题讨论】:

  • 我也在尝试从 Windows 服务生成 PDF。当我调用 QuickReport.Prepare 语句时,我的服务停止。没有错误信息。您如何从服务中生成快速报告?

标签: web-services delphi pdf-generation quickreports


【解决方案1】:

我猜QReport.Client 在代码后面的某处使用,并且您修改后的代码不再将其分配给 AProgress,您最终会遇到错误。

您确定要修改 QuickReport 源吗?我在 Windows 服务中使用 QuickReport 来生成 PDF 文件,然后附加到电子邮件消息中,一切正常,无需修改 QR 源。我不记得必须进行哪些设置,但它是使用 Delphi 6 和 QR 4.06 完成的。

【讨论】:

  • 您还记得您是否在 TIdTCPServer 后面生成这些 PDF(如在 Web 服务或 Web 服务器中)?谢谢!
  • 不,我们没有。服务中涉及的唯一网络组件是 SMTP 连接组件。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多