В постановке задачи и реализации принимал участие Сергей Коцюра (CheBurator).
Задача:
На форме есть текстовое поле (текстовый атрибут, "Т" на панели инструментов конфигуратора). Текущий текст во время исполнения определяется динамически, т.е. длина выводимого на форму текста может быть произвольной (в разумных пределах).
Требуется обеспечить масштабирование шрифта так, чтобы текущий текст полностью помещался в отведенное для его отображения текстовое поле с максимально возможным размером шрифта. Для чего: если текст короткий - выводится крупным шрифтом, если текст длинный - выводится шрифтом помельче. При этом обеспечивается равномерное заполнение текстового поля. Решение, продемонстрированное в данной задаче, может применяться, например, для построении фиксированных экранных форм для АРМ или ТСД.
Примечание:
Аналогичная задача ранее успешно была решена для автомасштабирования шрифтов для вывода на печать этикеток товаров с гарантированным размещением полного названия/описания товара в отведенное поле.
См. публикацию: //infostart.ru/public/181223 .
Вызов функции:
хЗаголовок(хФорма,хЦель,хТекст,хШрифты,хРежим=0)
Параметры:
хФорма - Передаётся ключевое слово "Форма" (без кавычек).
хЦель - Символьная строка содержащая имя текстового атрибута на форме.
хТекст - Символьная строка для отображения в текстовом атрибуте формы. В любом месте текста допускается использование специального символа - Симв(1). Это обеспечивает запрет разрыва следом идущего текст (до пробела или РазделительСтрок) на отдельные слова. Если требуется не разбивать на слова часть текста, то эту часть можно подготовить оператором:
КусокТекста=" "+Симв(1)+СтрЗаменить(ЧастьТекста," ",Симв(160))+" ";
или
КусокТекста=" "+Симв(1)+СтрЗаменить(ЧастьТекста," ",Симв(160))+РазделительСтрок;
хШрифты - Список значений заполненный шрифтами для подбора размера текст. Размер шрифтов должен быть в нарастающей последовательности размеров. Последним элементом списка значения следует добавить шрифт, которым будет отображаться текст в случае аварийного завершения функции хЗаголовок. Список значений можно, например, подготовить операторами:
Для К=6 По 30 Цикл
хШрифты.ДобавитьЗначение(ФормСервис.СоздатьШрифт("Arial",К),Строка(К));
КонецЦикла;
хШрифты.ДобавитьЗначение(ФормСервис.СоздатьШрифт(),Строка(0));
В символьное представление значения элемента (второй параметр метода ДобавитьЗначение) списка значение надо поместить размер шрифта как число преобразованное к строке.
хРежим - Задаёт режим работы функции:
=0 - Текст отображается шрифтом максимального размера без разбиения длинных слов. Длинные слова могут вылезти (обрезаться) за ширину области текстового атрибута формы. Если в хТекст присутствует "специальный символ", то он не оказывает влияния на алгоритм работы функции хЗаголовок и не отображается в текстовом атрибуте формы.
>0 - Текст отображается шрифтом максимального размера с разбиением длинных слов. Запретить разбиение длинных слов можно путём использования специального символа (подробнее см. в описании параметра хТекст). Если длинное слово не помещается в область текстового атрибута формы по ширине, то подбирается шрифт меньшего размера для размещения длинного слова без вылезания (обрезания) за ширину области текстового атрибута формы.
<0 - Режим аналогичен режиму, когда хРежим>0.
Возвращает:
<0 - Никогда не возвращается.
=0 - Произошёл сбой (см. раздел "Ограничения") при выполнении функции и текст отображён шрифтом "аварийного завершения".
>0 - Номер элемента списка значений хШрифты, которым удалось отобразить текст.
Решение:
Перед чтением, ниже идущего описания способа решения задачи, рекомендуется выполнить внешнюю обработку "ДемоМасштаб.ert" и заглянуть в её реализацию .
0) Суть решения сводится к анализу наполненности выводимым текстом прямоугольной области, лежащей ниже текстового поля. Если в этой области что-то есть - значит текст не влез в отведенное ему текстовое поле и надо уменьшить шрифт (при подборе шрифта от бОльшего к меньшему).
1) На форме имеется (размешается "проектировщиком" формы) текстовый атрибут (назовем его - хЦель).
2) Создаётся (при выполнении алгоритма) рабочий/временный атрибут (назовем его - хВизир) равный по размеру атрибуту хЦель и расположенный в тех же координатах формы.
3) Запускается цикл по списку значений (создаётся пользователем функции хЗаголовок) в котором содержатся шрифты в нарастающей последовательности размеров. Список используемых шрифтов подготавливается заранее, с использованием метода СоздатьШрифт объекта Сервис внешней компоненты FormEx™.
4) На очередной итерации цикла определяется высота шрифта. Высота атрибута хВизир увеличивается на высоту шрифта с сохранением его положения на форме (верхнего-левого угла и ширины).
5) Для атрибута хВизир устанавливается шрифт из элемента списка значений.
6) Выполняется оператор хВизир.Заголовок="". И сохраняется методом Save внешней компоненты MagicEsc в оперативной памяти прямоугольник экрана (назовем его хДельта), расположенный в области атрибута хВизир ниже начальной (равной высоте атрибута хЦель) высоты этого атрибута.
7) Выполняется оператор хВизир.Заголовок =хТекст для заполнения атрибута требуемым в задаче текстом. И производится сравнение методом Compare внешней компоненты MagicEsc равенства "пустого" прямоугольника экрана и прямоугольника, в котором мог появиться "кусок" хТекста.
8) В зависимости от результата сравнения выполняются следующие действия. При равенстве прямоугольников экрана цикл продолжается. Т.е. текст выведенный данный шрифтом в хВизир уместится целиком в атрибуте хЦель. В противном случае используется шрифт из предыдущей итерации цикла для установки его атрибуту хЦель и выполняется оператор хЦель.Заголовок =хТекст с завершением цикла подбора шрифта.
Ограничения:
Предлагаемый алгоритм успешно работает, если область экрана хДельта полностью видна на экране. Т.е. окно с формой не свёрнуто, хДельта не закрыта другим изображением, не сдвинута (полностью или частично) за пределы экрана (модальный режим) или за пределы основного окна сессии 1С. Для обхода этого ограничения в алгоритме производится проверка не "видимости" области хДельта с "аварийной" выдачей хТекст предопределённым для этого случая шрифтом.
Используемые внешние компоненты:
1) FormEx™: http://www.dorex.pro/?projects&formex
2) Внешняя компонента MagicEsc: //infostart.ru/public/103866
Протестировано на FormEx™ версий: 133, 140, 141.