Возможен ли Crystal Report с Output = toWindow из фонового потока Delphi? - PullRequest
1 голос
/ 28 сентября 2010

возможно ли выполнить отчет Crystal (компонент TCrpe) из основного потока Delphi non VCL, когда Output = toWindow?

  • Я выполняю отчеты из фонового потока, и когда для параметра Output выбрано значение toPrinter или toExport, все в порядке.
  • Я знаю, что создание форм в Delphi non VCL основной поток обычно является плохая идея.
  • Когда кристалл Отчет выполнен, и Output = toWindow, компонент создает вывод окно само по себе. Поэтому я не могу предотвратить создание окна фоновым потоком.
  • Так есть ли чистый способ выполнить отчет в фоновом режиме и отобразить результат в виде чисто созданная форма?
  • Версия: Crystal11VCL7

Следующий код не работает:

procedure TMyThread.Execute;
var
  cr: TCrpe;
begin
  inherited;
  cr:= TCrpe.Create(nil);
  cr.ReportName:= 'C:\TestReport.rpt';
  cr.Output:= toWindow;
  cr.WindowParent:= Form1; //This is the main form
  cr.Execute;
end;
  • Похоже, что отчет будет создан и сразу же уничтожен.
  • Когда я вхожу в цикл сообщений сразу после cr.Execute (while true do Application.ProcessMessages; - что, очевидно, является очень плохой идеей), окно отчета отображается красиво.

Есть идеи, как это сделать правильно? Или это просто невозможно? Спасибо!

1 Ответ

1 голос
/ 30 сентября 2010

У меня не было опыта работы с Crystal в течение многих лет (слава богу), но в отсутствие какого-либо другого ответа я бы рассмотрел подход к проблеме под другим углом.

Что я делаю, так это позволяю создавать форму отчета в главном потоке - потому что, как вы сказали, не очень хорошая идея делать VCL в фоновом режиме - но я генерирую весь отчет / данные / в фоновый поток. Как только данные загружены, поток сообщает основную форму (или что-то еще) через сообщение Windows, и отчет отправляется и подключается к набору данных / источнику данных.

Сначала я отображаю пустую метку над клиентской областью окна отчета с сообщением, напоминающим что-то вроде «Загрузка отчета ...», затем, как только сообщение получено, оно скрывает метку и прикрепляет данные. Здесь очень хорошо работает и поддерживает отзывчивость интерфейса.

...