![]() |
|
|
![]()
|
|
| docjohn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 6.10.2005 Репутация: нет Всего: нет |
Билдер 6.
Программа пробегает таблицу, берет из нее инфу, на ее основе создает лист отчета и посылает ее на печать. Для этого в QReporte делаю: Prepare() и затем Print(). Таких листов генерится несколько тысяч. При этом программа после генерации каждого листа съедает часть памяти (примерно 250кб). Не есть гуд. Если не делать Prepare() страниц, то они также генерятся и печатаются, занимаемая программой память при этом увеличивается. Но окно проги не перерисовывается. Почему? После печати каждой страницы уже пробовал Destroying(), Destroycomponents(). Не помогло. Help |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Интересно, а как ты определил что 250 кб теряется, да и вообще покажи код.
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| docjohn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 6.10.2005 Репутация: нет Всего: нет |
Используемую программой память смотрю в диспетчере задач.
В результате формирования определенного кол-ва страниц вычислил среднее значение используемой памяти на одну страницу как разницу до и после выполения программы, деленное на кол-во сформированных страниц (к примеру, страница пустого отчета с одним компонентом TQuickRep занимает 47 кб.). Главное - не это значение, а вообще утечка памяти. По идее нужно освобождать память после формирования очередной страницы. В общем делаю формирование и печать страниц по циклу без просмотра страниц. Что-то типа: for(...) { qreport->Prepare(); qreport->Print(); } В хэлпе по Prepare: "Use prepare if you want to generate a report without automatically bring up a preview window or print it." |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Попробуй
QuickRep1->QRPrinter->Free(); -------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| docjohn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 6.10.2005 Репутация: нет Всего: нет |
Выдает ошибку Access violation...
Если подойти к проблеме с другой стороны: зачем подготавливать и печатать каждую страницу, если можно подготовить один раз весть многостраничный отчет и потом один раз его напечатать. Для этого использую компонент TCompositeReport. В нем в событии OnAddReports нужно прописать для каждой страницы QRCompositeReport1->Reports->Add(Form1->QuickRep); Но кол-во и содержание страниц неизвестно заранее. Нужно делать что-то типа for(...) { QRCompositeReport1->Reports->Add(Form1->QuickRep); } QRCompositeReport1->Prepare(); QRCompositeReport1->Print(); НО! В результате отчет пустой: нет для печати ни одной страницы. Где ошибка? Почему не формируется многостран. отчет? |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
Давай конкретный код, а то по твоим скелетам ошибку не вычислить.
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| docjohn |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 6.10.2005 Репутация: нет Всего: нет |
Вот код: пробегаем по результатам OracleDataSet, для каждой его строки формируем страницу отчета в функции makelist и печатаем:
Где qr - TQReport. В результате отчет нормальный, но утечка памяти. Следующий вариант более предпочтителен: делать формирование многостран отчета один раз и затем печать всего, то:
Где cr - TCompositeReport В результате - пустой отчет. ХЗ почему. |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Утечку памяти нужно ловить специальными средствами(хотя бы CodeGuard), а не диспечером.
Если CodeGuard сообщит об утечке, то надо верить, да и это не всегда. А учет диспечером от лукавого. А что бы убедится в этом, после того как Ваша программа нахватала памяти, попробуйте ее свернуть и потом развернуть. Вполне вероятно будете весьма удивлены результатом. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| docjohn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 6.10.2005 Репутация: нет Всего: нет |
Да в общем, мой вопрос свелся к изменению метода формирования многостраничного отчета.
Содержимое страниц динамическое. На странице отчета компонент TOracleDataSet имеет пустой SQL. Он заполняется перед формированием отчета. В обработчике TCompositeReport по циклу выполненяю cr->Reports->Add(form1->qr); Однако в Prewiev формируются только статические элемены отчета. Динамические TQRDBText все пустые. ??? |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Ну так это означает, что у TQRDBText не присвоены DataField или DataSet
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |