Создание PDF с помощью быстрых отчетов за веб-сервером Delphi - PullRequest
1 голос
/ 31 декабря 2008

У меня есть веб-сервер Delphi, предоставляющий некоторые веб-сервисы *. Один из них должен генерировать и возвращать отчет в формате PDF.

Создание PDF выполняется с помощью QReport, который затем экспортируется в файл PDF с помощью процедуры ExportToFilter.

Подпрограмма работает нормально, когда вызывается из приложения, но при вызове из-за TIdTCPServer она зависает и никогда не завершается. Отладив его, я получил точку зависания:

(примечание: я сейчас дома, и у меня нет исходного кода. Я постараюсь воспроизвести исходный текст quickrpt.pas настолько точно, насколько я помню).

procedure TCustomReport.ExportToFilter(TQRDocumentFilter filter);
  ...
  AProgress := TQRFormProgress.Create(Application); // Hangs on this line
  AProgress.Owner := QReport;
  if ShowProgress then AProgress.Show;
  QReport.Client := AProgress;
  ...

Выполняя поиск в Интернете, я обнаружил на этой странице (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 совершил недопустимое действие и должен быть закрыт», а затем еще пару раз , затем просто указатель исключения, затем приходит к ошибке 216 (которая, насколько я мог выяснить, связана с разрешениями доступа Windows).

Спасибо!

Обновление (5 января) : Спасибо Скотту В. за ваш ответ . Действительно, после некоторых исследований я обнаружил еще одно предположение, что только основной поток может получить доступ к некоторым компонентам. Поэтому я установил нормальный QR-код и вызвал метод main из вызова Synchronize внутри TThread (чтобы основной поток мог его обработать). Но я все еще получаю ту же ошибку.

Вы упоминаете, что смогли сгенерировать PDF как сервис с помощью QR 4. Может быть, поэтому он не работает для меня, так как я использую QR 3. С другой стороны, вы не упоминаете, делаете ли вы что за TIdTCPServer (в моем случае это предоставление веб-сервисов) или если вы запускаете его самостоятельно (например, во время пакетного процесса).

Кто-нибудь знает, может ли быть проблема с моей версией QR? Спасибо!

* Запуск Delphi 7 и QuickReport 3 в Windows XP SP2. Сервер основан на Indy.

** У меня есть две версии сервера: приложение Windows и служба Windows. Оба вызывают одну и ту же внутреннюю логику, и проблема возникает с обеими версиями.

Обновление (8 марта) : В конце концов, моя проблема заключалась в том, что моя процедура печати находилась в другом dll, а модуль управления памятью по умолчанию несколько дрянной. Установка первого использования моего .dpr на ShareMem переопределяет модуль управления памятью с реализацией Borland и решила мою проблему.

uses
    ShareMem, ...

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

1 Ответ

1 голос
/ 05 января 2009

Я предполагаю, что QReport.Client используется где-то позже в коде, и если ваш измененный код больше не назначает его AProgress, вы получите ошибку.

Вы уверены, что вам нужно изменить источник QuickReport? Я использовал QuickReport в службе Windows, чтобы сгенерировать файл PDF, а затем прикрепить его к сообщению электронной почты, и все работало нормально, не изменяя источник QR. Я не помню, какие именно настройки должны были быть сделаны, но это было сделано с Delphi 6 и QR 4.06.

...