Как сделать ценники с составом продуктов в FastReport VCL

25.09.2023

Как сделать ценники с составом продуктов в FastReport VCL

При печати этикеток, ценников и других форматов с ограниченными размерами возникает проблема, при которой накладываются ограничения на подход разработки таких отчетов. В таких условиях объект текст может расти только до определенных размеров, а разрывать и переносить текст на другую страницу невозможно. Как же в данном случае уместить состав продукта и другие данные на одной этикетке не обрезая данные? Ответ прост - уменьшать содержимое!

Начиная с версии 2023.3 в движок отчетов FastReport VCL добавился еще один мощный инструмент – уменьшение текста в объекте «Текст», через масштабирование содержимого.

Рассмотрим простой пример ценника с составом продуктов. Такой ценник печатается на подготовленной бумаге, принтером для печати этикеток, поэтому есть физические ограничения по количеству текста на печати. Но состав может варьироваться от 3 до нескольких десятков слов.

Для создания такого отчета воспользуемся функцией создания многоколоночных отчетов. Как создать такой отчет, можно найти в руководстве пользователя. Воспользуемся примером создания простого отчета с двумя колонками, как на рисунке ниже. Мы не будем углубляться в процесс создания отчета, а сконцентрируемся на необходимом функционале. Готовый пример отчета можно скачать тут.

Шаблон отчета в дизайнере


Запустим отчет на построение.

Построенный отчет

По итогу в предпросмотре видно, что в таблице присутствуют продукты, состав которых состоит из десятков слов и он не помещается на ценнике с текущим размером шрифта. Выходом из данной ситуации, очевидно будет уменьшение размера шрифта.

Вернемся в дизайнер отчетов, выделим объект, и текст, который не помещается в границы, а после откроем инспектор объектов.

Свойство в инспекторе объектов

Нужным нам функционалом управляет набор свойств ContentScaleOptions. Рассмотрим его подробней.

AutoScale – по умолчанию выключен, свойство устанавливает режим работы авто масштабирования текста.

Режим casStatic включает масштабирование текста до тех пор, пока он не будет помещаться в контейнер или не достигнуты крайние границы ограничений (свойства Constraints.MaxStepValue и Constraints.MinStepValue).

Режим casStatic отлично подходит для использования в отчете с ценниками, включим его и запустим отчет на построение.

Построенный отчет

По результату построенного отчета можно заметить, что текст масштабируется не только на уменьшение размера, но и на увеличение. Что позволяет заполнять большой контейнер. Для некоторых отчётов это может быть полезно, но в текущем случае излишне.  Вернемся в дизайнер отчета и отключим флаг cstGrow у свойства ContentScaleOptions.ScaleType. Запустим отчет на построение.

Построенный отчет

Теперь FastReport VCL печатает ценники уменьшая размер шрифта, если текст не поместился в объект. Нужный результат достигнут переключением всего двух свойств.

Пример с этикетками является одним из самых распространённых, но бывают ситуации, когда бэнд с растущими объектами нужно поместить на страницу без разрыва. Если объектов с текстом на таком бэнде несколько, то мы можем пожертвовать размером шрифта в некоторых из них, и тем самым сжать весь контейнер. Рассмотрим, как это работает на простом примере с произвольными данными (шаблон можно скачать тут).

Шаблон отчета в дизайнере

В данном примере каждый объект текста выводит большие параграфы текста, тем самым растягивая и смещая нижележащие объекты. После запуска отчета с демо данными отчет будет выглядеть как на скриншоте.

Построенный отчет

Как видно при большом количестве текста, бэнд будет разбит на две страницы (в нашем случае с разрывом объектов). Что делать если данные нужно поместить на одну страницу? Режим AutoScale установленный в casStatic для данного случая не подойдет, т.к. объекты имеют динамическую высоту, вычисляемую в процессе построения отчета. Кроме того, растягиваемые объекты смещают нижележащие. Для этого случая в FastReport VCL есть еще один режим масштабирования объектов, включаемый установкой свойства AutoScale в casDynamic.

Установим у объекта MainText свойство AutoScale в casDynamic и посмотрим на результат построения отчета.

Построенный отчет

Объект MainText уменьшился в размере и весь бэнд поместился на одну страницу. Но что, если нужно пропорционально сжимать текст в нескольких объектах?

Теперь установим у объекта BottomText свойство AutoScale в casDynamic и посмотрим на результат построения отчета.

Построенный отчет

По итогу оба объекта уменьшали размер шрифта до тех пор, пока бэнд не поместился на странице полностью.

FastReport VCL позволяет контролировать процесс сжатия объектов. Каждый цикл прохода по объектам уменьшает шрифт в объектах на заданный шаг, который установлен у объекта в свойстве ContentScaleOptions.StepValue. Это будет продолжаться до тех пор, пока бэнд не поместится на странице или не будут достигнуты крайние границы ограничений (свойства Constraints.MaxStepValue и Constraints.MinStepValue).

Кроме этого, каждый объект может обрабатываться только на заданной итерации прохода по объектам. Если необходимо чтобы первые две итерации уменьшения обрабатывали только объект BottomText, то достаточно установить свойство ContentScaleOptions. Для метода Constraints.MinIterationValue нужно присвоить значение 3 у объекта MainText (он пропустит две первых итерации). После построения отчет будет иметь следующий вид.

Построенный отчет

Как можно заметить, в первые две итерации наш движок отчета сжимал только объект BottomText, и как следствие, его содержимое имеет меньший масштаб. Визуально итерации можно представить следующим образом.

Построенный отчет

Такой итеративный подход к масштабированию содержимого (или текста) позволяет расставлять приоритеты для движка отчетов, указывая, какой объект сжимать и в какой очередности для достижения оптимального результата.

При большом количестве объектов такой подход может негативно влиять на скорость построения отчета. Поэтому количество итераций можно ограничивать на уровне движка отчетов через установку свойства TfrxReport.EngineOptions.ContentScaleMaxIterations (по умолчанию 10).

20 ноября 2024

Локализация и смена языков в FastReport VCL

FastReport VCL поддерживает 40 языков для локализации интерфейса и позволяет изменять язык на лету через меню или код, без перекомпиляции.
2 сентября 2024

Обзор облачного решения для создания и управления отчетами

МоиОтчеты Облако — это мощное облачное решение для создания и управления отчетами, обеспечивающее широкий спектр возможностей, от создания документов в различных форматах до интеграции с корпоративными системами.
11 декабря 2023

Новый транспорт S3 (Amazon) в FastReport VCL

В этой статье мы рассмотрим новый транспорт в S3 (Amazon) для FastReport VCL, являющийся объектным хранилищем файлов и бакетов.