Изменить порядок страниц

отредактировано 14:07 Раздел: FastReport 3.0
Здраствуйте...
Возник еще один вопрос....
Как мне можно изменить порядок выводимых страниц в отчета?
Допустим есть 6 страниц с какими-то данными... так вот как мне сделать, чтобы они показывались (и соответсвенно печатались) в окне превью в моем, предустановленном порядке, к примеру так - 1,4,2,5,3,6?
Какие события надо ловить и что менять?
Спасибо...

Комментарии

  • отредактировано October 2005
    Сделать это можно так(из Delphi):
    frxReport1.Objects.Move(3,1);//сдвигаем 4 на 2
    frxReport1.Objects.Move(4,3);//сдвигаем 5 на 3
    frxReport1.ShowReport();
    
    Св-во Object хранит список объектов отчёта (только страници и диалоговые формы), метод Move передвигает узел списка(не меняет местами,а передвигает).
    P.S.
    Делать это надо до построения отчёта.
  • отредактировано 14:07
    -=Den=-, спасибо большое! Получилось! Правда, не совсем то =)
    я имел ввиду, изменить порядок уже сгенерированных страниц...
    допустим имею 3 страницы на которых есть MasterDat`ы с разными полями из одной таблицы. При выводе в превью каждая страничка "расширяется" данными на 4 листа.... то есть итого получается 12 страниц. так вот изменить этот порядок? До вызова ShowReport() их разумеется нет в листе объектов frxReport1.
  • отредактировано 14:07
    Пробовал менять страници сформированого отчёта не получилось ;)
    Там все property READ ONLY, так что вам нужно искать другой путь.
  • отредактировано 14:07
    уже третий день бьюсь... =(
    генерирую !все! страницы в памяти, заполняю матрицой ячеек с нужными значениями.... но скорость работы - убийственная....... клиент подохнет моментом....
    Хотя, гораздо проще, сформировать всего 3-4страницы, посадить на них мастердата, закидать мемки с нужными полями и пусть себе генерит странички... а потом рассортировать их в необходимом порядке....
    Ну неужели нет решения, господа разработчики?.....
    Ну просто оооочень не хочется переходить на квикрепорт (других альтернатив нету)....хотя на том же квикрепорте реализовал тот же алгоритм, но как там рассортировать страницы еще большая загадка, чем в фастрепорте....
    Ну уважаемые девелоперы, ну плиз! оч нада =)
  • отредактировано 14:07
    А если каждую страницу хранить как отдельный отчет. Потом формировать их и собирать как композитный в нужном порядке.
  • отредактировано 14:07
    композитный отчет не пробовал... но нашел другое, более удачное, на мой взгляд решение проблемы. У меня стоит та же самая задача, раскидать большое количество полей на несколько сраниц. Думаю, кому-нибудь пригодится мое решение:

    1. Сначала генерирую динамичесский массив с записями, в которых по определенным правилам раскидываются все поля на страницы. Каждая запись содержит в себе координаты и высоту/ширину для мемо, выравнивание, рамку, привязку к датасету и полю, номер страницы. Тем самым, мы точно знаем сколько страниц займет один блок данных.

    2. В цикле создаю новые страницы в отчете. На странице хедер, футер и мастердата. На мастердату создаю мемки из массива.

    3. Подготавливаем отчет PrepareReport.

    4. Получаем количество получившихся страниц.

    5. Теперь начинается самое интересное. нам нужно отсортировать получившиеся страницы, таким образом, чтобы выводился отчет по блокам страниц. Для этого используем еще один временный отчет.

    6. Сортировка - приведу код.
    Заполняем временный отчет пустыми страницами. Количество берется из основного отчета:
    report2.clear; // очищаем временный отчет
    for i:= 0 to report.PreviewPages.Count - 2 do
       NewPage(report2);// моя функция, которая просто выплевывает newPage на отчет
    report2.PrepareReport;// подготавливаем его.
    
    Затем просто заменяем страницы в новом отчете, страницами в нужном порядке из старого:
    // переменная Block содержит в себе количество страниц на блок
    // переменная rec, получает количество блоков на отчет. Нам это нужно для прохода по отчету
    rec := (report.PreviewPages.Count div Block);
    j:=0;
    i:=0;
    for k := 0 to rec - 1 do
      begin
        repeat
          // заменяем текущую страницу во временного отчета на необходимую страницу из основного отчета.
          report2.PreviewPages.ModifyPage(i,report.PreviewPages.Page[j]);
          // это для красоты =)
          application.ProcessMessages;
          // увеличиваем индекс временного отчета
          inc(i);
         // вычисляем индекс следующей страницы в основном отчете
          j := j + rec;
        until j >= report.PreviewPages.Count; // пока не индекс не привысил количество страниц
        j:=k+1;
        if k = 0 then i:= i-1;
      end;
    

    7. Осталось только показать временный отчет ShowPreparedReport.
    Воть..... теперь о минусах и плюсах.
    Плюсы:
    .Скорость генерации страниц - хорошая.
    .Скорость сортировки - хорошая
    .Скорость генерации и отрисовки раз в 5 выше чем у CrossView (он тоже умеет переносить поля и отрисовывать все в нужном порядке)
    . Проход по приходящему корсору (датасету) происходит один раз.
    Минусы:
    Боюсь даж говорить =)...
    .Нам необходимо полность подготовить основной отчет. На это уходит время.
    .Нужно пользовать временный отчет =( (я не нашел другого решения)
    .Отжирается немерянное количество памяти =(
    . Нужно попробовать сделать тоже самое в QuickReport
    Вот такой вот расклад. Остаются еще несколько вопросов.
    К примеру, EngineOptions.UseFileCache = true и EngineOptions.MaxMemSize, кажется некорректно работают... память все равно "кушается" очень дико. Но с 1000-5000 записями вроде нормально все кешируется и не превышает 23Мб....

    Надеюсь, что есть другое, более быстрое и изящное решение задачи, буду ооочень рад, если кто поделится.
  • отредактировано November 2009
    мой вариант:
    1. frxReport1.PrepareReport;
    2. добавил в конец отчета равное исходому
    PageCount:=frxReport1.PreviewPages.Count;
    for i := 0 to PageCount - 1 do frxReport1.PreviewPages.AddEmptyPage(PageCount);
    // здесь пришлось поправить баг в frxPreviewPages.AddEmptyPage. Найдете легко... там всего 3 строчки))
    3. по своему алгоритму скопировал в хвост отчета на новые пустые места страницы
    for i:=0 to PageCount-1 do
    begin
    indexTo:=<вычислить по нужному алгоритму>
    frxReport1.PreviewPages.ModifyPage(PageCount+IndexTo, frxReport1.PreviewPages.Page);
    end;
    4. удалил исходные
    for i:=0 to PageCount-1 do
    frxReport1.PreviewPages.deletePage(0);

    по скорости - если не знать - не заметить добавки кода

    неплохо бы перенести в FAQ
  • Подскажите какой баг Вы там исправили.

  • Вероятно, изменил расположение вставляемой страницы.

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

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