Вопросик по композиту (TfrCompositeReport) v2.5

TfrCompositeReport
Дата: 01.06.2009 15:24:28
Приветствую.

Вопросик по композиту фаст-репорта 2.5.


Столкнулся с очень непонятной ситуевиной. Вопрос наверное крайне прост... но не получилось его решить мне пока...

Нужно подготовить нескольок отчетов и запихнуть их в композитный отчет. После чего показать весь получившийся список.

ТАк вот. Почему то композитный отчет отказывается показывать УЖЕ ПОДГОТОВЛЕННЫЕ отчеты...

Объясню на КРАЙНЕ простом примере:

Предположим, что на форме всего два компонента:
frReport1: TfrReport;
frCompositeReport1: TfrCompositeReport;


frReport1 - простейший. С одинм единственным мемориком... только чтобы было что нить...

Так вот, ВОТ ТАК - НЕ РАБОТАЕТ:

frReport1.PrepareReport;
frCompositeReport1.Reports.Add(frReport1);
frCompositeReport1.ShowPreparedReport;


т.е. я сначало подготавливаю отчет,потом добавляю в композит, и потом прошу показать ПОДГОТОВЛЕНЫЕ отчеты...


К слову сказать ТАК РАБОТАЕТ:
frCompositeReport1.Reports.Add(frReport1);
frCompositeReport1.PrepareReport;
frCompositeReport1.ShowPreparedReport;

но конечно же это совсем другая ситуация... Мне НЕОБХОДИМО СНАЧАЛО подготовить отчет, и потом его добавить в композит (просто потому что я в цикле меняю параметры в Датасетах... и соотвественно из одного шаблона получаются различные отчеты, которые я хочу просто добавить в композит и потом всей пачкой показать...)


Подскажите плиз... Что не так я делаю ?.... В доке таких подробностей не нашел... :(
Дополню
Дата: 01.06.2009 15:31:47
ЗЫ. Под "Не работает" я подразумеваю то, что данная команда фактически игнорируется... Т.е. окно предпросмотра не появляется...

Больше того... Вызов frCompositeReport1.PrintPreparedReportDlg; вместо ShowPrepared вызывает исключение List Index Out of bound !........
tAZAR
Дата: 01.06.2009 15:42:21
Теряете вызов
frCompositeReport1.PrepareReport;
перед
frCompositeReport1.ShowPreparedReport;
в первом варианте?
А зачем ?
Дата: 01.06.2009 16:41:32
А зачем нужен вызов frCompositeReport1.PrepareReport; ?

Ведь я ДО этого сделал frReport1.PrepareReport;....


Проблема ведь в том, что в мое случае так нельзя сделать.

PS. По ходу чтения Вам может показатся, что надо отчет просто распечатать в виде ОБЫЧНОГО отчета Master-Detail. НО в моем случае енто не подойдет :(.... Все дело в том, что я ОЧЕНЬ АКТИВНО использую OnUserFunction... И для каждой детальки нужно показывать разные данные с помощью OnUserFunction... Проблема в том, что OnuserFunction НЕ знает какая счас деталька печататется (когда происходит собтвенно вызов...).... Поентому мне и приходится в цикле по МастерСету проходить..... Я там перед каждым построением детальки сохраняю идентификатор, и тогда OnUserFunction работает...... Вот такой извращенный подход )) Боюсь что изменить енто нельзя......





Объясню.....
Я сейчас делаю так:

var
  fr : TfrReport;
begin

For I := 0 to MainDS.RecordCount do
begin
    
    DetailDS.Close;
    DetailDS.ParamByName... задаем параметры в детальке.
    DetailDS.Open;

    frTemplate.PrepareReport;    // Это вот тот самый отчетик

    fr  :=  CloneReport(frTemplate);   // Клонирую (ниже я опишу функцию клонирования... Есть вероятность что я ее направильно написал :) )

    frCompositeReport.Reports.Add(fr);

end;  // конец FOR

    frCompositeReport.ShowPreparedReport;


   // отчистка памяти от склонированы отчетов... но до ентого дело и не доходит :)
 ...
end;



// Функция клонирования (я вот думаю... а прально ли я ее замутил...)
function CloneReport(rp: TfrReport): TfrReport;
var
  stream: TMemoryStream;
  new_rp: TfrReport;
begin
stream := TMemoryStream.Create;
  try
    rp.SaveToStream(stream);
    new_rp := TfrReport.Create(Application);
    stream.Position := 0;
    new_rp.LoadFromStream(stream);
    Result := new_rp;
  finally
    stream.Free;
  end;
end;




Вот почему нельзя вызывать frCompositeReport.Preparereport. Ведь в нем хранятся куча Отчетов, каждый из которых ссылается на DetailDS... И если вызвать Preparereport для композита, то все они и распечатаются с одними и теми же данными.


А мой замысел таков:

В цикле по Мастердатасету пройтись, задавать данные для детали и ПОДГОТАВЛИВАТЬ отчет. После чего ПОДГОТОВЛЕННЫЙ отчет пихать в композит. После чего дать команду композиту распечатать ГОТОВЫЕ отчеты...

А что - вы хотите сказать что композитный отчет НЕ УМЕЕТ хранить уже готовые отчеты ??????????????????????? Он может тока не готовые хранить и "готовить" их сам ?.... енто очень плохо :( тогда енто объясняет проблему.... В принципе все будет работать если отчеты не складывать в композит а сразу печать... Но енто так неудобно для юзера будет :(