Как перенести Master-бэнд на другую страницу?

отредактировано 05:23 Раздел: FastReport 4.0
На скрине видно, что название осталось на предыдущей странице. Как его перенести на следующую?
Если устанавливать свойство keeptogether=true, то большие наборы данных (т.е. если пунктов в отделе много) переносятся на новую страницу, оставляя много места на предыдущей...

Комментарии

  • gpigpi
    отредактировано 05:23
    Перед печатью бэнда с названием проверяйте оставшееся место Engine.FreeSpace и если оно меньше высоты заголовка группы и мастердата, то делайте Engine.NewPage
  • отредактировано 05:23
    Спасибо! Помогло :)
  • отредактировано 05:23
    Оказывается такой способ не работает, если размер мастердаты увеличился :)
  • gpigpi
    отредактировано 05:23
    Тогда попробуйте использовать событие OnAfterCalcHeight
  • отредактировано 05:23
    Это событие правильно определяет только размер заголовка, так как вызывается для него, а бэнд находится ниже, поэтому его высота не считается :) Вызов OnAfterCalcHeight для нижнего бэнда не переносит заголовок...
  • отредактировано 05:23
    У вас имеется Engine.FreeSpace - место сколько осталось на странице, и высота текущего банда, т.е. можно точно определить поместиться ли только данная группа или ещё и мастердата.
  • отредактировано 05:23
    infom
    Вы не совсем меня поняли...

    Объясню подробнее:

    есть MasterData и DetailData, оба растягиваемые
    if Engine.FreeSpace < MasterData5.Height + DetailData2.Height Then Engine.NewPage;
    
    на событии OnAfterCalcHeight у MasterData5, то ширина DetailData2.Height ещё не посчитана (проверял не раз), а на событии OnAfterCalcHeight у DetailData2, Engine.NewPage не перенесет MasterDat'у...
  • отредактировано 05:23
    ivan_melnik написал: »
    Если проверять
    if Engine.FreeSpace < MasterData5.Height + DetailData2.Height Then Engine.NewPage;
    
    на событии OnAfterCalcHeight у MasterData5, то ширина DetailData2.Height ещё не посчитана (проверял не раз), а на событии OnAfterCalcHeight у DetailData2, Engine.NewPage не перенесет MasterDat'у...
    Вполне логично что не подсчитана.
    Есть два варианта решения этой проблемы:
    1. Делать отчет двухпроходным, запоминать зав первый проход высоты компонентов, а вторым проходом уже делать расположение.
    2. Посчитать высоту DetialData когда у неё одна строка на тестовом примере, допустим получиться у вас 40. И предложенную вами формулу преобразовать в следующую:
    if Engine.FreeSpace > MasterData5.Height+40  Then Engine.NewPage;
    

    Мне как-то приятнее использовать второй вариант, но если высоты детейлов у вас сильно различаются, то только первый вариант.

    Хотя есть одно маленькое замечание, почему бы вам не использовать GroupHeader, на скринах явно видно что вы просто группируете, по подразделению, используйте для этого GroupHeader, у которого свойство KeepTogether отлично бы справилось с вашей проблемой.
  • отредактировано 05:23
    infom написал: »
    Делать отчет двухпроходным, запоминать зав первый проход высоты компонентов, а вторым проходом уже делать расположение.

    Можно подробнее куда запоминать и на какие события вешать проверку. У меня 5 уровней данных и на всех надо отследить эти переносы.
  • отредактировано 05:23
    написал: »
    Можно подробнее куда запоминать и на какие события вешать проверку. У меня 5 уровней данных и на всех надо отследить эти переносы.

    if engine.FinalPass = true then
        if engine.freespace < DetailData1.Height+SubdetailData1.Height+databand41.height+PageFooter1.Height then
        engine.newpage;
    

    не срабатывает. Фриспейс всегда больше....как будто дочерние бенды не заполнены данными, хотя второй проход.

    Как это разруливается правильно?

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

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