Копирование Reportpage

отредактировано May 2014 Раздел: FastReport 4.0
Привет всем! Столкнулся со следующей проблемой... есть 2 страницы отчета. 2ую страницу в зависимости от определенного параметра необходимо постоянно добавлять к отчету....
Т.е. у меня в репорте есть Page1, Page2. Хочу сделать чтобы динамически создавались страницы как Page2.

Пишу вот так, но не работает.... чистая страница(((( :)
написал:
Page3 := TfrxReportPage.Create(DM1.frxReport1.Report);
Page3.CreateUniqueName;
Page3.Name := 'Page3';

Stream := TMemoryStream.Create;
TfrxReportPage(DM1.frxReport1.FindObject('Page2')).SaveToStream(Stream);
Stream.Position := 0;
Page3.LoadFromStream(Stream);
Stream.Free;

Что я делаю не так? и вообще можно ли динамически создавать страницы на основе имеющихся?

Комментарии

  • отредактировано 05:09
    Скорее всего, при сохранении в поток имя объекта тоже сохраняется, а два одинаковых объекта существовать не могут.
    Я тоже давненько занимался проблемой дублирования объектов, но так и не нашёл ответа, как это сделать по-нормальному.
    Для дублировать TfrxMemoView я перебирал все Memo в цикле и копировал свойства поштучно (хотя, скорее всего, это недостаток опыта в сериализации).
    Пришлите тестовый проект, возможно, получится покрутиться и обойтись без дублирования страницы.
  • отредактировано 05:09
    Nightmareterrible написал: »
    Скорее всего, при сохранении в поток имя объекта тоже сохраняется, а два одинаковых объекта существовать не могут.
    Я тоже давненько занимался проблемой дублирования объектов, но так и не нашёл ответа, как это сделать по-нормальному.
    Для дублировать TfrxMemoView я перебирал все Memo в цикле и копировал свойства поштучно (хотя, скорее всего, это недостаток опыта в сериализации).
    Пришлите тестовый проект, возможно, получится покрутиться и обойтись без дублирования страницы.

    Спасибо, что отозвались. Я думал совсем форум мертвый...)

    Вот тестовый проект. Копируется 2ая страница, но с ошибками памяти....
  • отредактировано 05:09
    Запустил ваш и проект и не смог отобразить отчёт никакими средствами.
    Убрал все датасеты, все ссылки на них, даже пришлось в блокноте редактировать файл test.fr3 - всё равно пишет ошибку, что источники данных не найдены.
    Пришлите, пожалуйста, проект, в котором хотя бы какой-нибудь отчёт сформируется. Список ошибок в прикреплённом файле.
    В отчёте страниц Page1 и Page2 нету, нет смысла вызывать их в цикле - будут ошибки. И кстати, если добавлять объекты в PageTest.Objects.Add , но не добавлять их в список в FastReport, то при выходе из программы будет ошибка, т.к. память надо освобождать самостоятельно
  • отредактировано 05:09
    А как добавить список элементов в FastReport?

    Вот другой пример отчета, элементарный... просто Мемо. Надо создать 2 страницу и на ней такой же Мемо.... и получить на вновь созданной странице к нему доступ....)
  • отредактировано 05:09
    Файл не скачивается.
    "Некоторые требуемые файлы отсутствуют. Если вы хотели просмотреть тему, возможно эта тема перемещена или удалена. Вернитесь назад и попробуйте снова."
  • отредактировано 05:09
    Короче, проблема решена!! Я переписывался с тех.поддержкой, после долгих переписок добился от них решения)

    Вот

    PageTest := TfrxReportPage.Create(nil);
    PageTest.AssignAll(TfrxReportPage(frxReport1.FindObject('Page1')));
    PageTest.Name := 'Page2';
    PageTest.Parent := frxReport1;

    Таким образом создается 2ая страница, на которой все названия элементов такие же как и на Page1, но управление ими независимо от Page1! =)
  • gpigpi
    отредактировано 05:09
    написал:
    Таким образом создается 2ая страница, на которой все названия элементов такие же как и на Page1, но управление ими независимо от Page1! =)
    Пройдитесь в цикле по всем элементам скопированной страницы и вызывайте CreateUniqueName для каждого элемента. Для датабэндов проставьте датасеты
    написал:
    Пришлите тестовый проект, возможно, получится покрутиться и обойтись без дублирования страницы.
    Я бы посоветовал просто поставить PageCount = 2 для страницы
  • отредактировано 05:09
    gpi написал: »
    Пройдитесь в цикле по всем элементам скопированной страницы и вызывайте CreateUniqueName для каждого элемента. Для датабэндов проставьте датасеты

    Я бы посоветовал просто поставить PageCount = 2 для страницы

    В том и проблема, что ни 1 ваш вариант, ни 2 мне не подходит) мне нужно знать имена элементов на новой дублированной странице.....
  • gpigpi
    отредактировано 05:09
    Для первого варианта подойдёт использование TagStr, а для второго варианта имя не меняется и страница не дублируется. Она просто формируется дважды и во время второго формирования можно поменять содержимое некоторых объектов

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

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