растягивание Subreport

отредактировано 03:36 Раздел: FastReport VCL
Имеется отчёт вида:
d919becb260c.png

У SubReport установлено свойство "Печать на бэнде" (PrintOnParent) в true. Проблема в том, что если те поля, которые идут после SubReport, растягиваются на большую высоту, нежели сам сабрепорт (или те поля, которые идут перед ним), то высота сабрепорта уже не пересчитывается и он не растягивается так, как нужно.
Пример:
bf79051ef151.png

Как заствить SubReport растягиваться на всю высоту MasterData?

Комментарии

  • отредактировано 03:36
    В общем решил проблему так.
    Cоздаю 2 массива (условно a и :) и переменные i, RowCount. Для MasterData6 кинул Child-бэнд и сделал ему высоту 0.
    Делаю отчёт двухпроходным.
    На событии OnBeforePrint для Page устанавливаю i и RowCount в 0;

    На событии OnAfterCalcHeight для MasterData6 прописываю код:
    if not Engine.FinalPass then
      begin
        a[i] := a[i] + MasterData6.Height;                                                     
      end;
    

    На событии OnBeforePrint для Child-бэнда прописываю код:
    b[i] := CountRow;                        
      CountRow := 0;           
      inc(i);
    

    На событии OnBeforePrint для MasterData, который лежит на SubReport, прописываю код:
    inc(CountRow);
    

    Для всех Memo, лежащих на MasterData из SubReport прописываю код:
    if Engine.FinalPass then
      begin
        if b[i] > 0 then                                                 
          TfrxMemoView(Sender).Height := a[i]/b[i]
        else
          TfrxMemoView(Sender).Height := a[i];                         
      end;
    

    То есть по сути на первом проходе отчёта запоминаю общую высоту и количество строк в SubReport, а на втором проходе каждой строке отчёта присваиваю высоту, равную общая/кол-во строк.

    Если кто-то предложит более красивое решение, буду признателен)
  • tarakantarakan Russia
    отредактировано 03:36
    san3k написал: »
    В общем решил проблему так.

    Если кто-то предложит более красивое решение, буду признателен)
    Тоже столкнулся с такой проблемой, но так и не смог повторить манипуляции автора.
    Может кто-то подробнее объяснить или предложить "более красивое решение"
  • отредактировано September 2019

    Эврика. См. первую картинку в посте. На MasterData6 поверх Subreport1 ложим пустые Memo по количеству и ширине повторяющие колонки Subreport1. Фреймы этих Memo будут имитировать вертикальные разделители полей Subreport'а. А также имитировать нижнюю границу Subreport'а (это нужно для последней строки данных MasterData6). Кто ещё не понял общий замысел - погнали дальше. Устанавливаем свойство новым пустым Memo StretchMode=MaxHeight. Остальные объекты в MasterData6 также должны иметь StretchMode=MaxHeight. У самого Subreport'а устанавливаем PrintOnParent=True, и каждому Memo убираем нижнюю границу. А впрочем, можно убрать и боковые. (StretchMode у объектов Subreport1 регулирует только их высоту внутри одной строки Subreport, поэтому отрегулируйте так, чтобы данные показывались без "обрезок"). Ну в принципе и всё. При печати многострочного Subreport'а верхняя граница у них собственная, нижняя граница - это верхняя граница следующей строки. Нижняя граница последней строки Subreport'а - это верхняя граница следующего Subreport'а (со следующей строки MasterData6), и она же - нижняя граница пустого Memo с MasterData6 (крайне необходима для самой последней строки самого последнего Subreport'а). Таким образом, объекты в Subreport'е могут быть вообще разной высоты, их нижнюю границу очерчивают другие объекты. А вертикальные границы перекрываются границами пустых Memo с родительского бенда MasterData6.

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

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