Вывод отчета при навигации по записям

отредактировано 20:51 Раздел: FastReport 4.0
Добрый день.

при навигации по DBGrid или другим визуальным компонентам на событие AfterScroll поставил frxreport1.ShowReport и вывожу в frxPreview1 Blob поле. Иногда выскакивает ошибка Access violation 06491983 read of adress 00000000 . если поставить обыкновенный DBRichEdit и отключить frxReport1. ShowReport , то отлично показывается содержимое BLOB поля в DBRichEdit и никаких ошибок.

Комментарии

  • gpigpi
    отредактировано 20:51
    Выложите простой тестовый проект с проблемой
  • отредактировано December 2007
    попытался дома без dxMemData написать проект, поставил на AdoQuery на событии AfterScroll делать frxReport.ShowReport , так вываливаюсь сразу на ошибку List Index of baund. с FrxReport связан frxPreview . В обычном dbRichEdit в это время всё нормуль. может нельзя формирование отчета ставить на собите AfterScroll ? тогда на какое событие, мне нужно выводить Blob поле записи на которую юзер перешел.

    Прилагаю файлы в Delphi 2007. База Oracle 10g и 9.X. состоит из двух полей id - number и opisanie - blob.
  • gpigpi
    отредактировано 20:51
    Вот проект http://rapidshare.com/files/74026183/test.zip.html на основе данных базы demo.mdb
    Всё работает, правда выводятся картинки из blob-поля и просто текст в TfrxRichView
  • отредактировано 20:51
    на работе нет возможности проверить данный проект. дома вечером посмотрю. я в своих проектах не использовал FRXRichObject , что это за зверь, какую функию выполняет и что будет если без него.

    спасибо.
  • gpigpi
    отредактировано 20:51
    я в своих проектах не использовал FRXRichObject , что это за зверь, какую функию выполняет и что будет если без него.
    
    У Вас в шаблоне используется TfrxRichView - Rich1
  • отредактировано 20:51
    сейчас вот еще что заметил на проекте который на работе. при быстрой навигации по записям выскакивает сообщение, с которого и началась данная тема, а вот при медленном - нет. заменил ShowReport на

    frxreport1.PrepareReport();
    frxreport1.ShowPreparedReport;

    и все работает без ошибок сейчас.

    а к вопросу о компоненте в вашем проекте на форме TfrxRichObject. так что с ним.ч то без него у меня все работает. ваш же проект без этого компонента чуть позже протестю .
  • отредактировано 20:51
    Запустил Ваш проект. до появления формы вывалилась ошибка Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 00420CAF in module Project1.exe' Read of Address 00000000 . СКорее всего она связана с тем, что Dataset заполняется а в это время вызывется ShoWReport. В своей програме на работе я поставил флаг, чтобы по скроллу событию записи начинали выводиться когда юзер фокус переведет в DBGrid. При быстрой навигации по DBGrid в вашей программе выскочила та же ошибка, что и при запуске. Попытался сделать PreparedReport и потом showpreparedReport в вашей программе вместо showReport, та же ошибка. На работе же это помогло.

    С меня наверное теперь версия дельфей и фастрепорта? FastRepport 4.4 , Delphi 2007 версия 11.0.2804.9245

    и хотелось бы услышать службу поддержки продукта. FastReport лицензионный у нас. Но для этого наверное нужно написать иным способом.

    с уважением
  • отредактировано 20:51
    У вас слишком быстро перестраивается отчет, т.е. получается, что на этапе когда строится предыдущий отчет, вы запускаете еще один, что и приводит к ошибке, т.к. приложение выполняется в одном потоке.
    Выходов несколько :
    - Использовать несколько потоков и выполнять новый отчет в свободном потоке, а при смене позиции в DBGRID останавливать текущее выполнение.
    - остановить выполнение отчета с помощью Report.Engine.StopReport, дождаться завершения (к примеру, в OnEndDoc), запустить отчет с новым набором данных.

    Во втором варианте естественно возможны задержки вывода отчета.
  • отредактировано 20:51
    Спасибо за ответ разработчикам. будем ждать доработок в этом направлении вашего продукта. и реализации многопоточности со стороны именно продукта, а не дополнительного кода каждого программера, сипользующего в своих приложениях , что скрывать, довольно удобный пакет fastreport. Пока же оставлю вариант с PrepareReport.

    С уважением.
  • отредактировано December 2007
    Боюсь, что PrepareReport вам не поможет, на маленьких отчетах это может быть и сработает, но если отчет большой....

    Попробую объяснить, почему это происходит.
    Ваше приложение работает в одном потоке, после вызова prepareReport начинает работать цикл построения отчета, в этом же цикле идет и обработка сообщений приложения (ProccessMessages), чтобы не было зависания приложения и соответственно обрабатывается и сообщение DBGrid.
    Получается, что следующие сообщение AfterScroll обрабатывается во время выполнения отчета, и отчет запускается на выполнение из самого цикла отчета .
    Тут есть и наше упущение, на днях добавлю проверку в PrepareReport , чтобы не строить отчет заново, если он уже запущен, но вам все равно придется вызывать StopReport в AfterScroll , т.к. новый отчет просто не будет запущен до завершения старого.


    FastReport полностью поддерживает многопоточность, но реализовывать вы ее должно сами.
    Для реализации многопоточности не нужно почти никаких усилий, достаточно определить свой класс потока и создавать в нем экземпляр отчета.
    type
      TPrepareThread = class(TThread)
      protected
        procedure Execute; override;
      public
        constructor Create(ReportName: String; Btn: TButton; LB: TLabel);
        property Report: TfrxReport read FReport write FReport;
      end;
    
    constructor TPrepareThread.Create(ReportName: String; Btn: TButton; LB: TLabel);
    begin
      inherited Create(False);
    end;
    
    
    
    procedure TPrepareThread.Execute;
    begin
      inherited;
      FReport := TfrxReport.Create(nil);
      FReport.OnClosePreview := OnClose;
      FReport.EngineOptions.EnableThreadSafe := True;
      FReport.EngineOptions.DestroyForms := False;
      FReport.EngineOptions.SilentMode := False;
      FReport.PreviewOptions.Modal := False;
      FReport.LoadFromFile(FReportName);
      FReport.PrepareReport;
    end;
    
    Маленький пример работы с потоками я уже выкладывал тут.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.