Общее количество страниц в двухпроходном отчете

отредактировано 19:36 Раздел: FastReport 3.0
В связи с требованиями делопроизводства заголовок группы не должен оставаться последним на странице.

Для решения этой проблемы (к сожалению, стандартных средств для этого я не обнаружил ;) ) я на первом проходе запоминаю высоту Group Header & Master Data (в OnCalcHeight), а на втором проходе стартую новую страницу (Engine.NewPage), если на текущей не хватает места для заголовка группы и ее первой записи.

Проблема в том, что переменная TotalPages возвращает старое количество страниц, не учитывая эти переносы, т.е. на последней страницы вполне реально увидеть надпись "Страница 130 из 129". Подскажите пожалуйста, как выйти из такого положения? ;)

Комментарии

  • отредактировано 19:36
    Попробуй так:
    Engine.NewPage;
    Set('TotalPages',<TotalPages>+1);
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 19:36
    qizz написал:
    Проблема в том, что переменная TotalPages возвращает старое количество страниц, не учитывая эти переносы, т.е. на последней страницы вполне реально увидеть надпись "Страница 130 из 129". Подскажите пожалуйста, как выйти из такого положения? ;)
    Помнится так работало в 2.x
    Какая версия FR? У меня в 3.17 при использовании в OnBeforePrint бэнда кода
     if Engine.FinalPass
       then Engine.NewPage;
    

    ToltalPages выводит нормальное значение. Попробуйте обновить версию.
  • отредактировано September 2005
    Noskov написал:
    Попробуй так:
    Engine.NewPage;
    Set('TotalPages',<TotalPages>+1);
    Так не получится. Представьте, что разбивка на страницы по умолчанию была бы такая:
    первая страница          вторая страница
    -----------------------------------------------------
        запись 1                      запись 4
        запись 2
        запись 3
    -----------------------------------------------------
    

    Тогда, если мне нельзя осталять запись 3 последней на странице, я переношу ее на следующую, но общее количество страниц не меняется, т.к. места на второй странице хватает. Если же вторая страница будет заполненной, то последняя запись не влезет, и произойдет формирование третьей страницы самим ядром FastReport'a.
    Поэтому каждый раз увеличивать количество страниц не годится.
  • отредактировано 19:36
    Andrew_Sh написал:
    Помнится так работало в 2.x
    Какая версия FR? У меня в 3.17 при использовании в OnBeforePrint бэнда кода
     if Engine.FinalPass
       then Engine.NewPage;
    

    ToltalPages выводит нормальное значение. Попробуйте обновить версию.
    Версия 3.15. Дело в том, что ошибается он не всегда, а довольно редко, когда не хватает места (см. пример в предыдущем моем сообщении). А как оно может работать, если мне уже на первой странице нужно вывести общее количество страниц, а формирование новой страницы может встретиться где-то в середине, т.е
    общее количество страниц может увеличиться уже после печати первой страницы?
  • отредактировано 19:36
    TotalPages вычисляется на первом проходе, а Engine.NewPage дается на втором, т.е. страница может добавиться когда TotalPages уже вычислено. Попробуйте давать эту команду и на первом и на втором проходе. Думаю, что тогда количество страниц будет вычисляться корректно.
  • отредактировано 19:36
    Noskov написал:
    TotalPages вычисляется на первом проходе, а Engine.NewPage дается на втором, т.е. страница может добавиться когда TotalPages уже вычислено.
    В том-то и дело, что на первом проходе формировать новую страницу я не могу, т.к. еще не вычислена высота строки, что будет потом. Тут бы трехпроходной отчет разве что помог бы... Я вообще надеялся, что господа разработчики чего-нибудь подскажут ;)
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано September 2005
    qizz написал:
    qizz написал:
    Помнится так работало в 2.x
    Какая версия FR? У меня в 3.17 при использовании в OnBeforePrint бэнда кода
     if Engine.FinalPass
       then Engine.NewPage;
    

    ToltalPages выводит нормальное значение. Попробуйте обновить версию.
    Версия 3.15. Дело в том, что ошибается он не всегда, а довольно редко, когда не хватает места (см. пример в предыдущем моем сообщении). А как оно может работать, если мне уже на первой странице нужно вывести общее количество страниц, а формирование новой страницы может встретиться где-то в середине, т.е
    общее количество страниц может увеличиться уже после печати первой страницы?
    Повторяю, попробуйте в версии 3.17. Для проверки, работает ли правильно в 3.15 предлагаю следующее:
    1) Создайте новый отчет;
    2) Для MasterData выставьте
    RowCount=5,
    StartNewPage=true,

    3) Добавьте обработчик для MasterData1.OnBeforePrint
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
     if Engine.FinalPass
      then begin
        Engine.NewPage;
        ShowMessage(IntToStr(<TotalPages#>));
      end;
    end;
    

    4) На PageFooter в Memo1 поместите выражение
    [PAGE#] из [TOTALPAGES#]

    5) Внимательно смотрите, какое значение TotalPages выдает ShowMessage и какое значение выводится в Memo на футере.

    Выводы делайте сами. По крайней мере про 3.17 можно точно сказать, что <span style='color:blue'>точное значение TotalPages становится известно во втором проходе только после печати последней страницы и только потом в мемках происходит подстановка значений.</span>
  • отредактировано September 2005
    Andrew_Sh написал:
    4)  На PageFooter в Memo1 поместите выражение
    [PAGE#] из [TOTALPAGES#]
    Большое спасибо, проблема решена.
    Я использовал не [TOTALPAGES#], а [TOTALPAGES].

    Хотя в руководстве по поводу переменных написано следующее:
    TotalPages - всего страниц в текущем отчете (отчет должен быть двухпроходным)
    TotalPages# - всего страниц в пакете.

    Кто бы мог подумать, что несмотря на отсутствие каких-либо пакетов, нужно использовать именно вторую из них! ;)

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

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