Не всегда срабатывает 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) :)

Комментарии

  • отредактировано 00:37
    Мне кажется, что объект Engine может стать недоступным после обработки отчёта. Попробуйте использовать onManualBuild или в последнем датабенде в методе, например, AfterPrint или AfterData вызывать UserFunction с параметром FreeSpace (ну или перенести код между Begin и End в шаблон отчёта).
    Всё зависит от того, что же именно вы делаете между этими Begin и End.
  • отредактировано 00:37
    воспроизвести проблему можно очень простым путем. На форму кинуть кнопку и frxReport. в репорте сделать шаблон с msterdata и в нем мемо с текстом. на клик кнопки прописать
    frxReport1.PrepareReport(False);
      showmessage(FloatToStr(frxReport1.Engine.FreeSpace));
    
    и после 2-3 клика возникает ошибка
  • отредактировано 00:37
    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;
    
  • отредактировано 00:37
    Nightmareterrible написал: »
    оно?
    procedure GroupHeader2OnAfterCalcHeight(Sender: TfrxComponent);
    begin
      MasterData2.RowCount :=Round(abs((Engine.FreeSpace - 20) div Memo21.Height));
    end;
    
    нет, после загрузки шаблона и подготовки его (preparereport(False)) идет анализ надо ли вставлять разрыв после него перед загрузкой следующего.
    я пока убрал эту фичу и разрыв вставляется всегда (благо он не особо заметный).
    Но баг остается или я просто не знаю как правильно использовать это свойство в данной версии
  • отредактировано 00:37
    Вариант №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/ )
  • отредактировано 00:37
    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/ )

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

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

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