Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QReport, Ест память 
:(
    Опции темы
docjohn
Дата 2.2.2006, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Билдер 6.
Программа пробегает таблицу, берет из нее инфу, на ее основе создает лист отчета и посылает ее на печать. Для этого в QReporte делаю: Prepare() и затем Print().
Таких листов генерится несколько тысяч.
При этом программа после генерации каждого листа съедает часть памяти (примерно 250кб).
Не есть гуд.
Если не делать Prepare() страниц, то они также генерятся и печатаются, занимаемая программой память при этом увеличивается. Но окно проги не перерисовывается. Почему?

После печати каждой страницы уже пробовал Destroying(), Destroycomponents().
Не помогло.


Help
PM MAIL   Вверх
Artemon
Дата 2.2.2006, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Интересно, а как ты определил что 250 кб теряется, да и вообще покажи код.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
docjohn
Дата 3.2.2006, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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."







PM MAIL   Вверх
Artemon
Дата 3.2.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Попробуй

QuickRep1->QRPrinter->Free();




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
docjohn
Дата 6.2.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Выдает ошибку Access violation...

Если подойти к проблеме с другой стороны: зачем подготавливать и печатать каждую страницу, если можно подготовить один раз весть многостраничный отчет и потом один раз его напечатать.
Для этого использую компонент TCompositeReport.
В нем в событии OnAddReports нужно прописать для каждой страницы
QRCompositeReport1->Reports->Add(Form1->QuickRep);

Но кол-во и содержание страниц неизвестно заранее.
Нужно делать что-то типа
for(...) {
QRCompositeReport1->Reports->Add(Form1->QuickRep);
}
QRCompositeReport1->Prepare();
QRCompositeReport1->Print();

НО! В результате отчет пустой: нет для печати ни одной страницы.

Где ошибка? Почему не формируется многостран. отчет?

PM MAIL   Вверх
Artemon
Дата 6.2.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20



Давай конкретный код, а то по твоим скелетам ошибку не вычислить.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
docjohn
Дата 7.2.2006, 02:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Вот код: пробегаем по результатам OracleDataSet, для каждой его строки формируем страницу отчета в функции makelist и печатаем:
Код

  form1->ods->Active=true;
  form1->ods->First();
  while(!form1->ods->Eof)
  {
        form1->makelist(form1->ods->Fields->Fields[0]->Text);
        form1->qr->Prepare();
        form1->qr->Print();
        form1->ods->Next();
  }
  form1->ods->Active=false;

Где qr - TQReport.
В результате отчет нормальный, но утечка памяти.

Следующий вариант более предпочтителен: делать формирование многостран отчета один раз и затем печать всего, то:
Код

  form1->ods->Active=true;
  form1->ods->First();
  while(!form1->ods->Eof)
  {
        form1->makelist(form1->ods->Fields->Fields[0]->Text);
        cr->Reports->Add(form1->qr);    
        form1->ods->Next();
  }
  form1->cr->Prepare();
  form1->cr->Print();
  form1->ods->Active=false;

Где cr - TCompositeReport
В результате - пустой отчет.
ХЗ почему.
PM MAIL   Вверх
Vyacheslav
Дата 7.2.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Утечку памяти нужно ловить специальными средствами(хотя бы CodeGuard), а не диспечером.
Если CodeGuard сообщит об утечке, то надо верить, да и это не всегда. А учет диспечером от лукавого.
А что бы убедится в этом, после того как Ваша программа нахватала памяти, попробуйте ее свернуть и потом развернуть. Вполне вероятно будете весьма удивлены результатом.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
docjohn
Дата 7.2.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Да в общем, мой вопрос свелся к изменению метода формирования многостраничного отчета.

Содержимое страниц динамическое.
На странице отчета компонент TOracleDataSet имеет пустой SQL.
Он заполняется перед формированием отчета.
В обработчике TCompositeReport по циклу выполненяю cr->Reports->Add(form1->qr);
Однако в Prewiev формируются только статические элемены отчета.
Динамические TQRDBText все пустые. ??? smile

PM MAIL   Вверх
Vyacheslav
Дата 7.2.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Ну так это означает, что у TQRDBText не присвоены DataField или DataSet


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.