Помогите рассчитать месторасположение Bend на листе

отредактировано January 2013 Раздел: FastReport 4.0
Помогите пожалуйста определить месторасположения начала группы на листе!
В целях экономии бумаги задача такова. Есть перечень документов (Акт выполненных работ), их нужно распечатать на листах А4. Но есть условие, если размер документа меньше или равен половине листа то на следующей половине (но именно с середины) печатать следующий документ. Предварительно документы отсортированы по количеству строк спецификации.

Я пытался реализовать эту задачу с помощью свойства группы Top, то есть находил местоположение начала группы и если оно в пределах первой половины листа то растягивал Memo на разницу (пол листа) - (местоположение начала группы).
Как то так:

if((GroupHeader1.Top/37.7953 > 0) and (GroupHeader1.Top/37.7953 < 13.85)
then
Memo20.Height := 13.85*37.7953 - Child1.Top;


Но почему то не работает.

Комментарии

  • gpigpi
    отредактировано 06:09
    Engine.CurY определяет и задаёт текущую позицию вывода
  • отредактировано 06:09
    Спасибо gpi!

    Слепил вот такой скрипт:

    procedure Page1OnManualBuild(Sender: TfrxComponent);
    var DataSet1,DataSet2 : TfrxDataSet;
    nGroupHeader1 : Variant;
    nPageBegin : Variant;
    nPageEnd : Variant;
    nSign : Variant;

    begin
    DataSet1 := MasterData1.DataSet;
    DataSet2 := DetailData1.DataSet;

    // Цикл по мастеру
    DataSet1.First;

    while not DataSet1.Eof do
    begin
    nPageBegin :=<Page>;
    Engine.ShowBand(GroupHeader1);
    Engine.ShowBand(MasterData1);
    Engine.ShowBand(Header1);
    Engine.ShowBand(GroupHeader2);
    Engine.ShowBand(GroupHeader3);

    // Цикл по спецификации
    DataSet2.First;
    while not DataSet2.Eof do
    begin
    Engine.ShowBand(DetailData1);
    DataSet2.Next;
    end;

    Engine.ShowBand(GroupFooter1);
    Engine.ShowBand(GroupFooter2);
    Engine.ShowBand(GroupFooter3);
    nPageEnd :=<Page>;

    //Расчет местоположения следующей группы
    nGroupHeader1 := (Engine.CurY)/37.7953;

    if((nGroupHeader1 > 0 ) and (nGroupHeader1 < 13.85))
    then
    begin
    Engine.CurY := 13.85 * 37.7953;
    nSign :=1;
    end
    else
    begin
    Engine.NewPage;
    nSign :=0;
    end;

    if (nPageBegin <> nPageEnd)
    then Engine.NewPage;

    DataSet1.Next;
    end;
    end;

    Все работает супер, единственная проблема, если первый (на странице) документ короткий и помещается на половине листа, а следующий документ больше чем на половину то он должен начинаться со следующей страницы. А у меня он не переносится на следующую страницу.
    Думаю что надо по первому проходу подсчитать высоту всех Band документа, а по второму переносить на новый лист.
    Но пока не могу разобраться с первым и вторым проходом.

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

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