Вывод отчета при навигации по записям
Добрый день.
при навигации по DBGrid или другим визуальным компонентам на событие AfterScroll поставил frxreport1.ShowReport и вывожу в frxPreview1 Blob поле. Иногда выскакивает ошибка Access violation 06491983 read of adress 00000000 . если поставить обыкновенный DBRichEdit и отключить frxReport1. ShowReport , то отлично показывается содержимое BLOB поля в DBRichEdit и никаких ошибок.
при навигации по DBGrid или другим визуальным компонентам на событие AfterScroll поставил frxreport1.ShowReport и вывожу в frxPreview1 Blob поле. Иногда выскакивает ошибка Access violation 06491983 read of adress 00000000 . если поставить обыкновенный DBRichEdit и отключить frxReport1. ShowReport , то отлично показывается содержимое BLOB поля в DBRichEdit и никаких ошибок.
Комментарии
Прилагаю файлы в Delphi 2007. База Oracle 10g и 9.X. состоит из двух полей id - number и opisanie - blob.
Всё работает, правда выводятся картинки из blob-поля и просто текст в TfrxRichView
спасибо.
frxreport1.PrepareReport();
frxreport1.ShowPreparedReport;
и все работает без ошибок сейчас.
а к вопросу о компоненте в вашем проекте на форме TfrxRichObject. так что с ним.ч то без него у меня все работает. ваш же проект без этого компонента чуть позже протестю .
С меня наверное теперь версия дельфей и фастрепорта? FastRepport 4.4 , Delphi 2007 версия 11.0.2804.9245
и хотелось бы услышать службу поддержки продукта. FastReport лицензионный у нас. Но для этого наверное нужно написать иным способом.
с уважением
Выходов несколько :
- Использовать несколько потоков и выполнять новый отчет в свободном потоке, а при смене позиции в DBGRID останавливать текущее выполнение.
- остановить выполнение отчета с помощью Report.Engine.StopReport, дождаться завершения (к примеру, в OnEndDoc), запустить отчет с новым набором данных.
Во втором варианте естественно возможны задержки вывода отчета.
С уважением.
Попробую объяснить, почему это происходит.
Ваше приложение работает в одном потоке, после вызова prepareReport начинает работать цикл построения отчета, в этом же цикле идет и обработка сообщений приложения (ProccessMessages), чтобы не было зависания приложения и соответственно обрабатывается и сообщение DBGrid.
Получается, что следующие сообщение AfterScroll обрабатывается во время выполнения отчета, и отчет запускается на выполнение из самого цикла отчета .
Тут есть и наше упущение, на днях добавлю проверку в PrepareReport , чтобы не строить отчет заново, если он уже запущен, но вам все равно придется вызывать StopReport в AfterScroll , т.к. новый отчет просто не будет запущен до завершения старого.
FastReport полностью поддерживает многопоточность, но реализовывать вы ее должно сами.
Для реализации многопоточности не нужно почти никаких усилий, достаточно определить свой класс потока и создавать в нем экземпляр отчета.
Маленький пример работы с потоками я уже выкладывал тут.