Помогите рассчитать месторасположение Bend на листе
Помогите пожалуйста определить месторасположения начала группы на листе!
В целях экономии бумаги задача такова. Есть перечень документов (Акт выполненных работ), их нужно распечатать на листах А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;
Но почему то не работает.
В целях экономии бумаги задача такова. Есть перечень документов (Акт выполненных работ), их нужно распечатать на листах А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;
Но почему то не работает.
Комментарии
Слепил вот такой скрипт:
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 документа, а по второму переносить на новый лист.
Но пока не могу разобраться с первым и вторым проходом.