Добавление одного отчета к другому

отредактировано 04:07 Раздел: FastReport 4.0
Добрый день.

Есть большой отчет MAINREPORT, в который в циклах добавляются другие отчеты.
Первый цикл (внешний) добавляет страницы разделители TITLEREPORT.
ЭТО РАБОТАЕТ.
Второй цикл (i), сначала должен аналогичным способом сформировать страницу PAGEREPORT
из 3-х небольших отчетов, шаблоны которых выбираются по условию <УСЛОВИЕ>.
Подготовленная таким способом страница PAGEREPORT тоже добавляется в основной отчет MAINREPORT.
ЭТО ТОЖЕ РАБОТАЕТ.
Т.е. страницы TITLEREPORT и PAGEREPORT правильно добавляются в основной отчет.
НЕ ВЕРНО формируется страница PAGEREPORT. На ней виден всегда только ОДИН ПОСЛЕДНИЙ отчет (vFrame), а должно быть три друг за другом.

Где я не верно делаю?

<!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->// ЭТИ КОМПОНЕНТЫ НА ФОРМЕ
MAINREPORT : TfrxReport;
TITLEREPORT : TfrxReport;
PAGEREPORT : TfrxReport;
FRAME1 : TfrxReport;
FRAME2 : TfrxReport;

// ДАЛЕЕ ПРОЦЕДУРА
procedure TMyClass.ПРОЦЕДУРА
var
r, i : Integer;
vFrame : TfrxReport;
vPage : TfrxReportPage;
begin
// есть цикл, программно формирующий отчет
for r := 1 to 100 do
begin
// здесь формируем страницу-разделитель (заголовок)
TITLEREPORT.PrepareReport(true);

// здесь добавляем ТИТУЛ в основной отчет
// на первом шаге с очисткой основного отчета, затем - просто добавление в конец
Add2Composite(MAINREPORT, TITLEREPORT, r = 1);

// в этом цикле на отдельную страницу PAGEREPORT сначала собираем 3 небольших отчета
// шаблон добавляемого отчета выбирается по какому-то условию <УСЛОВИЕ> (FRAME1 или FRAME2)
for i := 1 to 3 do
begin
// создаем компонент для 'небольшого' отчета
vFrame := TfrxReport.Create(nil);

try
// тут выбираем 'небольшой' отчет
if <УСЛОВИЕ> then
Add2Composite(vFrame, FRAME1, true)
else
Add2Composite(vFrame, FRAME2, true);

// тут устанавливаем значение свойства PrintOnPreviousPage
vPage := vFrame.FindObject('repPage') as TfrxReportPage;
vPage.PrintOnPreviousPage := i <> 1;
// формируем 'небольшой' отчет
vFrame.PrepareReport(true);

// тут добавляем 'небольшой' отчет на страницу-контейнер
if i = 1 then
Add2Composite(PAGEREPORT, vFrame, true)
else
Add2Composite(PAGEREPORT, vFrame, false);
finally
vFrame.Free;
end;
end;

// тут добавляем страницу-контейнер в основной отчет
PAGEREPORT.PrepareReport(true);
Add2Composite(MAINREPORT, PAGEREPORT, false);
end;

// тут формируем основной отчет
MAINREPORT.PrepareReport(true);
MAINREPORT.ShowPreparedReport;
end;

function TMyClass.Add2Composite(const xDstReport, xSrcReport : TfrxReport; const xDstClear : Boolean) : Boolean;
var
vStream : TMemoryStream;
begin
// результат по умолчанию - копирование не выполнено
Result := false;

// если объекты-отчеты не созданы, копирование не выполнять
if (not Assigned(xDstReport)) or (not Assigned(xSrcReport)) then
Exit;

// очистить отчет-приемник
if xDstClear then
xDstReport.Clear;

// создать поток для копирования
vStream := TMemoryStream.Create;

try
try
// выполнить копирование подготовленного отчета
xSrcReport.SaveToStream(vStream);
vStream.Position := 0;
xDstReport.LoadFromStream(vStream);
xDstReport.PrepareReport(xDstClear);

// установить результат копирования
Result := true;
except
end;
finally
if Assigned(vStream) then
vStream.Free;
end;
end;<!--fontc--></span><!--/fontc-->

Спасибо.

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

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