Баг или я что-то не так делаю?

отредактировано December 2009 Раздел: FastReport Studio
Есть простенький отчёт: PageHeadre и PageFooter - чтобы на каждой странице было (там шапка бланка и подписи с датами соответственно). В середине Header (на нём шапка таблицы) и MasterData (сами данные таблицы). Идея в том, что если данные не влезают на один лист, то при переносе автоматом получается два и т.д. листа со своими шапкой и подписями. Здесь возникает проблема с нумерацией: она сквозная. А надо, что бы на следующем листе она начиналась с единицы. С Line и Line# мне ничего сделать не удалось - не сбрасываются они. Пришлось завести переменную и сбрасывать её после печати Header и увеличивать на единицу после печать MasterData. И вроде все хорошо в теории, но на практике получается то, что видно на картинке: на каждом следующем листе первая строчка имеет неправильный номер. Вот я и не пойму - я накосячил, или бага такая? А может фича?

Вот сваял примерчик:

Комментарии

  • отредактировано 07:20
    Смотрите документацию , там описано поведение переменных Line и Line# , а так же чем они отличаются.
    Добавлю, что эти переменные и не должны сбрасываться на новой странице.
  • отредактировано December 2009
    написал: »
    Смотрите документацию , там описано поведение переменных Line и Line# , а так же чем они отличаются.
    Добавлю, что эти переменные и не должны сбрасываться на новой странице.
    Как работают эти переменные и чем они отличаются я знаю. Я на них сослался потому, что их функционал меня не устраивает для данного отчета. Поэтому я и завел переменную. Вопрос не в этом. Почему первый элемент на втором листе начинается не с единицы, а с продолжения предыдущей нумерации? При этом события AfterPrint у обоих бандов похоже вызывается, т.к. нумерация дальше идет в нужном порядке.

    To -=Den=-: Прежде чем отвечать и отправлять к документации, неплохо бы скачать тестовый отчет и посмотреть в чем проблема. Там сразу станет ясно, что Line и Line# там никаким боком не затрагиваются и речь вообще не о них...
  • отредактировано 07:20
    Я просто пояснил , что переменный Line для этого не предназначены.
    Возможно, не дочитал ваше сообщение :)
    По поводу скрипта - это нормально поведение, бэнд сначала выводится с вызовом всех событий и только потом переносится при нехватке места.
    Для корректной работы в OnAfterCalcHeight проверяйте высоту бэнда и тут же переносите его.
    В этом же событии прибавляйте к своей переменной.
    procedure MasterData1OnAfterCalcHeight(Sender: TfrxComponent);
    begin
     if MasterData1.Height > Engine.FreeSpace then
       Engine.NewPage;
     Inc(lineIdx);  
    end;
    
  • отредактировано 07:20
    Убрал событие MasterData1OnAfterPrint и вместо него создал MasterData1OnAfterCalcHeight с описанным выше кодом. Результат такой же, как и в первом сообщении. Т.е. визуально ничего не изменилось: нумерация первого пункта неправильная.

    Вот отчёт:
  • отредактировано December 2009
    Для простых отчетов код нужно перенести в OnBeforePrint(попутал события в пер. сообщении).
    А для сложных (растягиваемых) придется делать 2 прохода и использовать OnAfterCalcHeight для вычисления высоты (т.к. он может меняться).

    Пример отчета, который может растягиваться приложен.
  • отредактировано December 2009
    В итоге все решилось разнесением переноса на новую страницу и увеличением переменной по разным событиям.
    procedure Header1OnAfterPrint(Sender: TfrxComponent);
    begin
      Set('RowNumber', 1);
    end;
    
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
      if (MasterData.Height > Engine.FreeSpace) then
         Engine.NewPage;
    end;
    
    procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
    begin
      Set('RowNumber', <RowNumber> + 1);        
    end;
    
    Уф, теперь вроде правильно работает.
  • отредактировано December 2009
    SINys написал: »
    В итоге все решилось разнесением переноса на новую страницу и увеличением переменной по разным событиям.
    Если бэнд будет растягиваться , такой вариант работать не будет.
    Т.е. этот вариант для фиксированных размеров бенда.

    SINys написал: »
    PS: Кстати, отчёт из предыдущего ответа тоже не правильно работает:
    у него первые две строчки имеют одинаковый номер (обе равны единице)... :)

    отчет работает, просто забыл убрать обнуление переменной из Header1OnAfterPrint, оно там не нужно.
    Вместо Newpage там обнуляется переменная :)

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

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