Помогите ещё одному новичку с Freereport. Пожалуйста!

AlexandrSTAlexandrST Московская область
отредактировано September 2007 Раздел: FastReport 3.0
Здравствуйте!
Помогите новичку в FreeReports!
Ситуация:
Delphi7. Форма. На форме 15 закладок (PageControl). На каждой закладке свои модули расчётов и оформления. То есть набор Edit, label, Image. Вводятся данные - происходят расчёты. Все 15 закладок должны выводиться на печать в виде сегментов (по 5 на листе). Причём выводимые сегменты выбирает юзер.
У меня несколько непоняток:
1) Как лучше организовать структуру отчёта? На одном отчёте не получается - каждая закладка на отчёте идёт отдельным бэндом и все 15 естественно не умещаются на одном листе в дизайнере. Я пробовал сделать SubReports, но остановился на композитном отчёте и на каждую закладку создал по своему отчёту на котором один бэнд-сегмент с оформлением. Наверно слишком запутанно, но по-другому не придумал, подскажите пожалуйста.
2) В некоторых сегментах (на бэндах) нужно скрывать некоторые элементы в зависимости от условий. Делаю:
Page.FindRTObject('Memo1').Visible:=false;
Page.ShowBandByName('MasterData1');
Но возникает проблема. Когда я формирую композитный отчёт, то все 15 отчётов-закладок со свойством страницы "Пристыковывать к предыдущему отчёту вплотную". Но при добавлении какой-либо информации в событие ManualBuild отчёта, он не пристыкрвывается, а печатается на новой странице каждый. Надо добавлять какую-то строку в ManualBuild для пристыковки?
3) Когда делаю отчёт с подотчётами (SubReports), то не могу "дотянуться" до объектов на под-отчётах. То есть, если объект memo1 находится на SubReport, то
Page.FindRTObject('Memo1').Visible:=false;
выдаёт ошибку, что такой объект не найден, а видит лишь объекты на основной странице. Как обратиться к объекту на SubReport'е?

Заранее огромное спасибо за помощь. Помогите пожалуйста подневольному прогеру-самоучке :)

Комментарии

  • отредактировано 06:58
    AlexandrST написал: »
    На одном отчёте не получается - каждая закладка на отчёте идёт отдельным бэндом и все 15 естественно не умещаются на одном листе в дизайнере.
    А если расширить отображаемое в дизайнере пространство?
    У Page есть свойство LargeDesignHeight, поставьте в true.
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    aseroff написал: »
    А если расширить отображаемое в дизайнере пространство?
    У Page есть свойство LargeDesignHeight, поставьте в true.
    Не нахожу у себя такого свойства. Возможно, его и нет, так как я использую Free Report 2.33.
    Или я просто не там ищу.
  • gpigpi
    отредактировано 06:58
    Во Free Report такого свойства нет :)
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    gpi написал: »
    Во Free Report такого свойства нет :)
    Как же тогда выйти из ситуации? Остаются SubReports либо композитный. Но в SubRepotrs я не могу обратиться к объектам на них. Как?
  • отредактировано 06:58
    Можно создать переменные (fx), через которые полностью управлять видимостью сабрепортов.
    И уже эти переменные передавать из программы отчету.
    Пример поиска переменных (правда на фастрепорте и на С++):
    frxReport1->Variables->Items[frxReport1->Variables->IndexOf("ClientNameVisible")]->Value = true;
    
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    aseroff написал: »
    Можно создать переменные (fx), через которые полностью управлять видимостью сабрепортов.
    И уже эти переменные передавать из программы отчету.
    Спасибо. Но управлять видимостью SubReports не проблема в моём случае. Проблема управлять видимостью объектов на SubReports. То есть если текстовое поле Memo1 находится не на основном листе отчёта, а на SubReport'е, то я немогу выполнить
    Page.FindRTObject('Memo1').Visible:=false;
    
    Хотя если тот же самый Memo1 переместить на основной лист отчёта, то эта строка работает как положено.
    Получается, что я программно этой строкой могу "дотянуться" только до основного листа отчёта.
    А как мне "дотянуться" до объектов на Sub-листах?
  • отредактировано 06:58
    AlexandrST написал: »
    Спасибо. Но управлять видимостью SubReports не проблема в моём случае. Проблема управлять видимостью объектов на SubReports. То есть если текстовое поле Memo1 находится не на основном листе отчёта, а на SubReport'е, то я немогу выполнить
    Page.FindRTObject('Memo1').Visible:=false;
    
    Если создать переменную (назовем ее Memo1Visible), в отчете в скрипте пропишем:
    begin
    Memo1.Visible = Get ('Memo1Visible');
    end
    
    а в программе сделаем:
    AlexandrST написал: »
    Пример поиска переменных (правда на фастрепорте и на С++):
    frxReport1->Variables->Items[frxReport1->Variables->IndexOf("Memo1Visible")]->Value = true;
    
    или что-то вроде на паскале.

    затем сделаем ShowReport
    ТО мы таким образом будем управлять видимостью элементов на подотчетах.
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    Спасибо! Примерно понятно :)
    А почему при составлении композитного отчёта отчёты отдельные не пристыковываются друг к другу если я делаю ManualBuild бэндов на отчётах? Хотя галочка "Печатать вплотную к предыдущему отчёту" стоит, но перестаёт работать, когда я сам управляю видимостью бэндов в ManualBuild...Но если ManualBuild пустой, то всё ок - пристыковываются.
  • отредактировано 06:58
    А что такое ManualBuild и где он находится?
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    aseroff написал: »
    А что такое ManualBuild и где он находится?
    frReport1 - События - OnManualBuild
  • отредактировано 06:58
    А что вы выполняете в OnManualBuild?
    Может эту функциональность можно перенести в другие события?
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    aseroff написал: »
    А что вы выполняете в OnManualBuild?
    Может эту функциональность можно перенести в другие события?
    Ну например:
    procedure TForm1.frReport1ManualBuild(Page: TfrPage);
    begin
    Page.NewPage;
    Page.ShowBandByName(A);
    Page.ShowBandByName( :) ;
    end;
    
    Где A и B - переменные, которым присваиваются названия бэндов в зависимости от условий, тем самым
    формируется порядок показа бэндов на отчёте и их показа вообще.

    Или например:
    procedure TForm1.frReport1ManualBuild(Page: TfrPage);
    begin
    if A=1 then Page.FindRTObject('memo1').Visible:=false else Page.FindRTObject('memo1').Visible:=true;
    end;
    
    Это видимость объекта на бэнде в зависимости от условия.
    Выше мне предложили выполнять видимость через скрипт на отчёте.

    Вообще команды с Page.хххх можно использовать только в событии OnManualBuild кажется.
  • отредактировано 06:58
    написал:
    Выше мне предложили выполнять видимость через скрипт на отчёте.
    Стоит попробовать.

    Такой вопрос. Что вам мешает перед отображением отчета и после создания его объекта присвоить значения видимости элементов? Зачем вы заменяете обработчик события???

    В скрипте всегда создается функция без названия (только begin end) там можно реализовать ваши алгоритмы видимости.
  • AlexandrSTAlexandrST Московская область
    отредактировано 06:58
    aseroff написал: »
    Такой вопрос. Что вам мешает перед отображением отчета и после создания его объекта присвоить значения видимости элементов? Зачем вы заменяете обработчик события???
    Непонимаю.
    У меня нарисован отчёт с подотчётами на которых бэнды. Я управляю видимостью бэндов на подотчётах тем самым формирую основную страницу отчёта. Но мне ещё надо управлять видимостью элементов на бэендах. Для этого я прописываю в OnManualBuild условия видимости. В других событиях эта запись не осуществима (Page.FindRTObject('memo1').Visible:=false). Предложен вариант сделать через скрипт в отчёте. А какие ещё есть варианты? В каком событии отчёта можно прописать условия видимости и каким образом?

    То есть если объекты и бэнды находятся на главной странице отчёта, я делаю:
    procedure TForm1.frReport1ManualBuild(Page: TfrPage);
    begin
    Page.NewPage;
    if A=1 then Page.FindRTObject('memo1').Visible:=false;
    ...
    Page.ShowBandByName(Epos);
    ...
    Page.ShowBandByName(Ppos);
    end;
    
    А потом по кнопке на форме:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    frReport1.Preview:=Form2.frPreview1;
    frReport1.ShowReport;
    end;
    

    Научился только так.
  • отредактировано 06:58
    Я же говорю,
    procedure TForm1.frReport1ManualBuild(Page: TfrPage);
    
    можно и без этого.
    В
    procedure TForm1.Button1Click(Sender: TObject);
    
    до
    frReport1.ShowReport;
    
    пишите
    if A=1 then Page.FindRTObject('memo1').Visible:=false;
    
    и др. операции, при этом не надо составлять последовательность отображения отчета, кокторая у вас и так уже выстроилась при его создании.

    Если вы хотите спрятать какой-либо бенд, там же задайте ему свойство Visible = false

    А сбивается ваше отображение т.к. вы делаете
    Page.NewPage;
    
    После этого необходимо у етой NewPage выставить все свойства вручную...
  • AlexandrSTAlexandrST Московская область
    отредактировано September 2007
    aseroff написал: »
    Я же говорю...
    Класс! всё легко и просто оказывается :) Спасибо!

    Пока вопросов больше не имею. Спасибо всем за ответы, особенно aseroff.

    Будут вопросы - обращусь. Знаю, что поможете :)

    Спасибо!

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

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