Не всегда срабатывает Freespace

отредактировано April 2014 Раздел: FastReport 4.0
Здравствуйте. после перехода с 3-го фастрепорта на 4-й возникла следующая проблема.
Есть код:
FReport.LoadFromFile("шаблон");
FReport.PrepareReport(False);
  if (FReport.PreviewPages.Count = 0) or
       ((FReport.Engine.FreeSpace > AHeight) and (AHeight > 0)) then
    begin
 
    end

так вот. в этом коде часть FReport.Engine.FreeSpace в половине случаев кидает access violation. В FR3 всё работало замечательно.
в FReport уже есть подготовленный отчет (для ранее загруженного шаблона было уже выполнено FReport.PrepareReport(False) :)

Комментарии

  • отредактировано 10:34
    Мне кажется, что объект Engine может стать недоступным после обработки отчёта. Попробуйте использовать onManualBuild или в последнем датабенде в методе, например, AfterPrint или AfterData вызывать UserFunction с параметром FreeSpace (ну или перенести код между Begin и End в шаблон отчёта).
    Всё зависит от того, что же именно вы делаете между этими Begin и End.
  • отредактировано 10:34
    воспроизвести проблему можно очень простым путем. На форму кинуть кнопку и frxReport. в репорте сделать шаблон с msterdata и в нем мемо с текстом. на клик кнопки прописать
    frxReport1.PrepareReport(False);
      showmessage(FloatToStr(frxReport1.Engine.FreeSpace));
    и после 2-3 клика возникает ошибка
  • отредактировано 10:34
    Nightmareterrible написал: »
    Мне кажется, что объект Engine может стать недоступным после обработки отчёта. Попробуйте использовать onManualBuild или в последнем датабенде в методе, например, AfterPrint или AfterData вызывать UserFunction с параметром FreeSpace (ну или перенести код между Begin и End в шаблон отчёта).
    Всё зависит от того, что же именно вы делаете между этими Begin и End.

    это будет сделать проблематично. итоговый отчет строится из маленьких частей. и эти части могут использоваться по несколько раз, между которыми вставляется разрыв и вот при вставке разрыва надо проверять поместится ли он на текущей странице для этого и используется FreeSpace
  • отредактировано April 2014
    оно?
    procedure GroupHeader2OnAfterCalcHeight(Sender: TfrxComponent);
    begin
      MasterData2.RowCount :=Round(abs((Engine.FreeSpace - 20) div Memo21.Height));
    end;
  • отредактировано 10:34
    Nightmareterrible написал: »
    оно?
    procedure GroupHeader2OnAfterCalcHeight(Sender: TfrxComponent);
    begin
      MasterData2.RowCount :=Round(abs((Engine.FreeSpace - 20) div Memo21.Height));
    end;
    нет, после загрузки шаблона и подготовки его (preparereport(False)) идет анализ надо ли вставлять разрыв после него перед загрузкой следующего.
    я пока убрал эту фичу и разрыв вставляется всегда (благо он не особо заметный).
    Но баг остается или я просто не знаю как правильно использовать это свойство в данной версии
  • отредактировано 10:34
    Вариант №2:
    В том же AfterPrint или AfterCalcHeight вызываете MY_FUNCTION1(Engine.FreeSpace).
    При этому у вас должен быть код при создании TfrxReport (можно в Form.onCreate)
    frxReport1.AddFunction('function MY_FUNCTION1(space:integer): boolean');

    и Код обработчика:
    function frxReport1UserFunction(const MethodName: string;
      var Params: Variant): Variant;
    begin
      inherited;
      if MethodName = 'MY_FUNCTION1' then
      begin
        // Делам то, что нужно
        ...
        // Возвращаем результат
        Result := somebool;
      end;
    end;
    Название функции - только в верхнем регистре.


    О других способах прочитать Engine без глюков я не знаю. RTFM ( http://www.fast-report.com/ru/download/documentation/ )
  • отредактировано 10:34
    Nightmareterrible написал: »
    Вариант №2:
    В том же AfterPrint или AfterCalcHeight вызываете MY_FUNCTION1(Engine.FreeSpace).
    При этому у вас должен быть код при создании TfrxReport (можно в Form.onCreate)
    frxReport1.AddFunction('function MY_FUNCTION1(space:integer): boolean');

    и Код обработчика:
    function frxReport1UserFunction(const MethodName: string;
      var Params: Variant): Variant;
    begin
      inherited;
      if MethodName = 'MY_FUNCTION1' then
      begin
        // Делам то, что нужно
        ...
        // Возвращаем результат
        Result := somebool;
      end;
    end;
    Название функции - только в верхнем регистре.
    О других способах прочитать Engine без глюков я не знаю. RTFM ( http://www.fast-report.com/ru/download/documentation/ )

    спасибо за совет, но всё равно хотелось бы чтоб работало так как работало раньше, т.е. всегда

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