А зачем нужен вызов 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 для композита, то все они и распечатаются с одними и теми же данными.
А мой замысел таков:
В цикле по Мастердатасету пройтись, задавать данные для детали и ПОДГОТАВЛИВАТЬ отчет. После чего ПОДГОТОВЛЕННЫЙ отчет пихать в композит. После чего дать команду композиту распечатать ГОТОВЫЕ отчеты...
А что - вы хотите сказать что композитный отчет НЕ УМЕЕТ хранить уже готовые отчеты ??????????????????????? Он может тока не готовые хранить и "готовить" их сам ?.... енто очень плохо :( тогда енто объясняет проблему.... В принципе все будет работать если отчеты не складывать в композит а сразу печать... Но енто так неудобно для юзера будет :(