Разные page footer для разных страниц

отредактировано 20:08 Раздел: FastReport 2.xx VCL
Столкнулся с проблемой и не могу придумать как ее решить.
В общем делаю отчет (спецификацию). На первой странице штамп должен быть одного вида, на второй и последующих - другого (меньше ячеек).
Так вот не могу придумать, как реализовать.
Несколько страниц делать вроде как не подходит, т.к. как такового титульного листа нет. Обычный master-detaildata отчет. Есть band overley для создания основной рамки линиями, есть мастер header, master data, page header, page footer. Все.
С разными шапками для первой и последующих страниц разобрался (выводится на первой master header без page header, на остальных - только page header), а вот с разными подвалами никак ;)
Delphi - 6.0
FR - 2.50
P.S. Программно че-та не прет создавать page footer, хотелось бы дизайнером иметь возможность править в рантайме такие вещи.

Комментарии

  • Евгений ПришкоЕвгений Пришко Украина, Харьков
    отредактировано 20:08
    сделай 2 child бэнда
    на одном 1 тип футера
    на 2 - второй
    pagefooter.child -> child1
    child1.child -> child2
    проперти showchildifinvisible = true
    pagefooter.visible := false
    В onbeforeprint pagefooter

    child1.visible := [page#] = 1;
    child1.visible := [page#] <> 1;
  • отредактировано 20:08
    написал:
    pagefooter.child -> child1
    child1.child -> child2
    проперти showchildifinvisible = true
    pagefooter.visible := false
    В onbeforeprint pagefooter

    child1.visible := [page#] = 1;
    child1.visible := [page#] <> 1;
    Ездтл в командировку, прочел только сейчас.
    Не получается ;)

    pagefooter.child -> child1
    Где это прописать??? У PageFooter нету свойства childband и showchildifinvisible, а когда пишу в программе непосредственно PageFooter1.Child:=Child1 - компилятор ругается

    Вроде как понимаю, что писать надо в скрипте непосредственно в дизайнере, но не до конца...
  • Евгений ПришкоЕвгений Пришко Украина, Харьков
    отредактировано 20:08
    мой прокол, у pagefooter нет child. этого я не учел ;((
    В onbeforeprint pagefooter
    
    child1.visible := [page#] = 1;
    child1.visible := [page#] <> 1;
    

    все остальное делалось в дизайнере

    сорри что ввел в заблуждение...
    сейчас ломаю голову - ничего не получается....
    единственный вариант, который заработал... поместить оба варианта футера на один бэнд... а потом показывать нужное....
    но это муть
  • отредактировано 20:08
    написал:
    единственный вариант, который заработал... поместить оба варианта футера на один бэнд... а потом показывать нужное....
    В любом случае огромное спасибо. Хоть и не получилось без мути - узнал зато полезные вещи...
    Буду размещать оба варианта на page footer и в onbeforeprint footer'а прописывать видимость нужных полей...
  • отредактировано 20:08
    Создал кучу мемок для обоих вариантов штампа
    Прописал у pagefooter в onbeforeprint, какие элементы отображать на первой, какие - на остальных страницах

    Возникает проблема ;) Как теперь у pagefooter на первой странице сделать высоту 198 пикселей, а на остальных - 108.
    Прописываю у страницы в onbeforeprint
    if ([PAGE#]>1) then pagefooter1.height:=108;
    Пробовал и у pagefooter в onbeforeprint то же самое прописывать, но не хочет обрабатывать FastReport ;) Может есть какая заморочка? Отчет двухпроходный...
  • Евгений ПришкоЕвгений Пришко Украина, Харьков
    отредактировано 20:08
    не знаю как решить проблему с высотой... ;( не менял...
    заморочек у фаста много, но ругать его я не буду... слишком много вкусного...

    пока проверял варианты, пробовал использовать ColumnFooter вместо PageFooter
    работает не совсем так... выводится в конце каждой страницы, но сразу за последней записи... pagefooter в конце страницы, но лепится не к записи а к концу листа

    сейчас пришла мысль как его можно пристроить..
    закинь его (ColumnFooter) в отчет
    на него закинь штамп для первой страницы

    в onbeforeprint
    visible := [page#] = 1;

    на pagefooter - второй штамп
    выключаешь свойство "Печатать на первой странице"

    получаешь следующее... на первой странице columnFooter со штампом 1
    на остальных pagefooter со штампом 2
    изменять высоту не надо
    скритов минимум...

    попробуй... авось что-то путное из этого выйдет
  • отредактировано November 2004
    написал:
    на pagefooter  - второй штамп
    выключаешь свойство "Печатать на первой странице"
    Придумал такой вариант:
    на OverleyBand выложил вариант штампа для первой страницы, включаю видимость объектов, как ранее было описано, только на первой странице.
    PageFooter печатаю на второй и последующих страницах.

    Теперь возникает такая проблемка: оверлей печатается нормально, но! объекты detaildata на него залазют.
    Как ограничить область для detaildata, чтобы на первой странице они заканчивали формироваться, оставляя внизу пустое пространство размером примерно 200 пикселей, а на второй и последующих формировались до pagefooter.

    В общем искусственно сказать, что область печати на первой странице обрезана снизу на 200 пикселей, а на остальных - до pagefooter...

    Вроде даже понимаю, что через freespace и onbeforeprint у detaildata... Но не до конца.

    Вот уж беда так беда ;)
    В FRDemo скрипт у MasterData в onberoprint
    begin
    i := i + 1;
    BandHeight := Height;
    if FinalPass then
    if FreeSpace < BandHeights then
    NewPage;
    end
    работает нормально (причем и компилировал в своем же дельфи).

    Пишу у себя в отчете скрипт у MasterData в onbeforeptint
    begin
    if FinalPass then
    if FreeSpace < 200 then
    NewPage;
    end
    выдает ошибку: 'Could not convert variant of type (String) into type (Double)'.

    Может чего подскажете???
  • Евгений ПришкоЕвгений Пришко Украина, Харьков
    отредактировано 20:08
    begin
    if FinalPass then
    if FreeSpace < 200 then
    NewPage;
    end
    
    только что проверил - работает
    Fr 2.52 с некоторыми фиксами описанными на форуме

    попробуй вместо overlay использовать columnfooter со скриптом visible := [page#]=1;
    полагаю это решит проблему со штампом на первой странице..

    что касается скрипта... попробуй использовать [freespace]... авось поможет.. у фаста есть заморочки с форматом переменных
  • отредактировано 20:08
    написал:
    попробуй вместо overlay использовать columnfooter со скриптом visible := [page#]=1;
    полагаю это решит проблему со штампом на первой странице..
    ColumnFooter пробовал - его (если строк на первой странице мало) FR привязывает, как ты и говорил, к последней строке и соответственно он не на месте...

    С проблемой несовместимости типов разобрался - оказывается FR при разборе скрипта обращается к ongetvalue, а там у меня для freespace возвращалось пустое значение... Вот и ругался.

    Счас переделал, написал скрипт у мастердата на онбефорепринт
    if (FinalPass) then
    if ([PAGE#]=1) and (FreeSpace<200) then
    NewPage;
    Новая страница стала создаваться.

    Но другая проблема блина возникла.
    Когда создается пустая страница (через newPage) первая строка на новой странице получается хрен знает какая (должно браться значение из стрингрида, а он пихает Memo4 - названия memo-поля).

    Т.е. у меня на мастердате в мемо4 написано [NAME], в мемо5 - [TYPE], в ongetvalue
    для [NAME]
    ParValue := SpecTable.Cells[2,frUserDataset1.RecNo+1];
    для [TYPE]
    ParValue := DictionarySQL.FieldByName('NAME').AsString;
    и при создании новой страницы в мемо4 появляется надпись Memo4, а на мемо5 FR ругается - говорит - не знаю, чего такое 'TYPE' ('Переменная не опрделена: "TYPE"' дословно)

    Чего делать? Подскажите! Замучился уже ;)
  • отредактировано 20:08
    Все, вроде как справился...

    Проблему с newPage так и не решил ;)

    Привязал к мастердата child'а высотой чуть меньше высоты штампа и только на первой сранице в конце вывожу этого чаилда. Тем самым в оверлее на первой странице штамп не перекрывается, а на остальных страницах оверлей чиститься, а штамп печатается за счет паджефутера.

    Вот так ;)

    Всем спасибо за помощь.

    Если будут какие-нить замечания и предложения - с вниманием прочитаю...

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

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