TfrxPreview композитный отчет

отредактировано 12:54 Раздел: FastReport 3.0
Создал собственную форму предварительного просмотра.
Метаданные отчета храню в БД. Перед формированием отчета загружаю метаданные отчета.
После этого создаю форму предварительного просмотра.
После этого пытаюсь сформировать композитный отчет.
Примерно так:
procedure TdmReport.LoadFR3(Rep: TfrxReport; DoClear: boolean = true);
var FR3Stream: TMemoryStream;
begin
  //..............
  FR3Stream := TMemoryStream.Create();
  try
  dsetReport.Open();
  if DoClear then Rep.Clear();
  dsetReportMETADATAREPORT.SaveToStream(FR3Stream);
  FR3Stream.Position:=0;
  Rep.LoadFromStream(FR3Stream);
  frxdsetMainRep.FieldAliases.Clear();
  dsetReport.Close();
  finally
  FR3Stream.Free();
  end;  
  //...........
end;

procedure SetPreviewComponent;
begin
  frMainRep.Preview := TfrmFR3Preview.Create(Application).frxPreview;
end;

procedure ShowSaleReportSession(SessionNumber: integer);
begin
  //Загружаем отчет 
  frMainRep.Tag := 1;
  LoadSaveFR3(frMainRep, true);
  SetPreviewComponent(); 
  
  frxdsetMainRep.DataSet := dsetKassirReport;
  dsetKassirReport.ParamByName('SMENA_NUMBER').AsInteger := SessionNumber;     
  frMainRep.PrepareReport(false);

  //Загружаем отчет 
  frMainRep.Tag := cCalcMany;
  LoadSaveFR3(frMainRep, false);
  frxdsetMainRep.DataSet := dsetCalcMany;
  frMainRep.PrepareReport(false);

  //Загружаем отчет
  frMainRep.Tag := cSale;
  LoadFR3(frMainRep, false);
  frxdsetMainRep.DataSet := dsetSaleReport;
  dsetSaleReport.ParamByName('IPOPERATE').AsInteger := SessionNumber; 
  frMainRep.PrepareReport(false);

  frMainRep.PrintOptions.ShowDialog := false; 
  frMainRep.Print();
  frMainRep.PrintOptions.ShowDialog := true; 
  frMainRep.ShowPreparedReport();
  //.....  
end;

В итоге на форме предварительного просмотра остается последний отчет. Хотя тоже саме со встроенным окном предварительного просмотра формируется все три отчета. В чем я не прав?

Комментарии

  • отредактировано 12:54
    Всем спасибо за внимание. Разобрался через техподдержку.
  • отредактировано 12:54
    В службе техподдержки написали...
    написал:
    Надо так:
    frxReport1.Preview := nil;
    //строим все отчеты
    frxreport1.Preview := your_preview

    Сделал, все вроде заработало.
    Только потом выяснились некоторые нюансы.

    Delphi 7. FastReport 3.23.1
    Схема, которая была предложена в вопросе по некорректному построению композитного отчета в собственном окне предварительного просмотра,
    работоспособна за исключение одного Но.
    При построении отчета первый раз, все нормально. При построении отчета второй раз, получаю ошибку доступа к памяти AV. Сначала предположил, что проблема у меня в приложении и долго пытался локализовать ее. Методом "научного клика" удалось выяснить, что данная ошибка появляется только, если перед построение отчета во второй
    раз я присваиваю свойству Preview := nil.
    Причем не имеет значения открывается отчет в обственном окне просмотра или в стандарном. Ошибка имеет место в обоих случаях.
    Для чистоты эксперимента создал пустое приложение с "нуля", но проблема осталась.

    Попробуйте поэкспериментировать с данным приложением, возможно я что-то сделал не так...
    Там есть три кнопки.
    1. Открывает отчет, предварительно загружая его из файла, в собственном окне просмотра. Перед построением отчета свойству Preview присваивается nil.
    При открытии отчета во второй раз (не закрывая предыдущего окна) - генерируется ошибка.
    Причем неважно, создаю ли я форму предварительного просмотра стиля MDIChild сразу перед построением отчета, либо потом присваиваю соответствующему свойству формы значение MDIChild.
    2. Строится композитный отчет. Свойству Preview не присваивается nil.
    Если не закрывая окна просмотра снова запустить построение отчета, то возникает таже проблема некорректного формирования композитного отчета. Формируется только последний загруженный отчет. На эту тему вопрос, почему во второй версии фастрепорта при повторном формировании отчета в любом случае открывалось новое окно предв. просмотра, а текущей версии отчет заново формируется в открытом окне просмотра (и возникает эта проблема)?
    2. Строится композитный отчет. Свойству Preview присваивается nil.
    При повторном формировании отчета (не закрывая предыдущего окна) получаю ошибку AV.
    Хотя при чем в данном случае это свойство??? Но ошибка имеет место.
    Отчет пытается открыть новое стандартное окно предварительного просмотра в данном случае,
    но увы... AV.

    От службы техподдержки ни ответа, ни привета на эту тему. А мне нужно подтвердить верны ли мои предположения или я делаю что-то неправильно?

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

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