Переменные Page и Totalpages в выражениях

отредактировано April 2012 Раздел: FastReport 4.0
Строю композитный отчёт.
В отчёте требуется выводить номер страницы на каждой странице и общее количество страниц на первой.
Причём каждую цифру номера в отдельный компонент memo.

Я использую, для вывода трёх цифр страницы, выражения (в самом отчёте для memo):
[copy(('0'+IntToStr(<Page#>)),Length(<Page#>)-1,1)]
[copy(('0'+IntToStr(<Page#>)),Length(<Page#>),1)]
[copy(<Page#>,length(<Page#>),1)]

это работает для Page#, но не работает для TotalPages# (именно в композитном отчёте, в многостраничном - работает)

Здесь : http://www.fast-report.com/documentation/U...emvariables.htm
вы пишите, что эти переменные (Page#, TotalPages#) нельзя использовать в выражениях.

Вопрос: как правильно вывести "общее количество страниц" композитного отчёта по цифрам?

Использую FR 4.10

Комментарии

  • gpigpi
    отредактировано 21:45
    Сохраните значение <Page#> для последней страницы отчёта в переменной и используйте это значение на втором проходе
  • отредактировано 21:45
    gpi написал: »
    Сохраните значение <Page#> для последней страницы отчёта в переменной
    И где вы предлагаете сохранить это значение?
    У нас композитный отчёт, т.е. состоящий из нескольких отдельных отчётов. Переменные определяются отдельно для каждого отчёта.


  • отредактировано 21:45
    Попробуем:

    Для каждого отчёта, входящих в композитный (для примера возьмём однин и тот же с MasterData1.RowCount=1):
    1. Добавляем переменые: vPage, vTotalPages, vPage#,vTotalPages#
    2. Добавляем событие:
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
        Set('vPage#', <Page#>);      
        Set('vPage',  <Page>);      
      if not Engine.FinalPass then begin
        Set('vTotalPages#', <TotalPages#>);
        Set('vTotalPages',  <TotalPages>);      
        end;
    end;
    
    3. Добавляем, поле memo.text=
    'vPage:[vPage] - vTotalPages:[vTotalPages] - vPage#:[vPage#] - vTotalPages#:[vTotalPages#]'

    В итоге получаем для композитного отчёта из трёх страниц (каждый отчёт - одна страница):

    vPage:0 - vTotalPages:2 - vPage#:0 - vTotalPages#:0
    vPage:1 - vTotalPages:1 - vPage#:1 - vTotalPages#:0
    vPage:1 - vTotalPages:1 - vPage#:2 - vTotalPages#:0

    если ставим:
    procedure Page1OnAfterPrint(Sender: TfrxComponent);
    begin
      if not Engine.FinalPass then begin
        Set('vTotalPages#', <TotalPages#>);
        Set('vTotalPages',  <TotalPages>);      
        end;
    end;
    
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
        Set('vPage#', <Page#>);      
        Set('vPage',  <Page>);      
    end;
    
    В итоге получаем для композитного отчёта из трёх страниц (каждый отчёт - одна страница):

    vPage:0 - vTotalPages:0 - vPage#:0 - vTotalPages#:0
    vPage:1 - vTotalPages:0 - vPage#:1 - vTotalPages#:0
    vPage:1 - vTotalPages:0 - vPage#:2 - vTotalPages#:0
  • gpigpi
    отредактировано 21:45
    Сделайте отчёт однопроходным, количество страниц определяйте так:
    frxReport1.Script.Variables := 0;
    frxReport1.PrepareReport(True);
    frxReport1.PrepareReport(False);
    frxReport1.PrepareReport(False);
    frxReport1.Script.Variables := frxReport1.PreviewPages.Count;
    frxReport1.PrepareReport(True);
    frxReport1.PrepareReport(False);
    frxReport1.PrepareReport(False);
    frxReport1.ShowPreparedReport;

    LastPage выводите в отчёте
  • отредактировано 21:45
    Спасибо за оперативный ответ.
    Но...
    1. Ваш пример подразумевает наличие Delphi. (тут-то никаких проблем с подстчётом количества страниц и тем более с установкой № страниц. Да можно и многостраничник из композитного сгенерить :) ).
    2. Вопрос же относится именно к отдельным отчётам (например, формируемым в дезайнере FastReport Studio и хранящимся в БД).
    3. Понятно, что TotalPages - это переменная, а TotalPages# - по сути макрос. Но интересует именно использование #. Поэтому и тема была задана "Переменные Page и Totalpages в выражениях".
  • gpigpi
    отредактировано 21:45
    Без Delphi, по-моему, Ваша задача нереализуема

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

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