![]() |
|
v7: Перенос текстовой переменной по ячейкам | ☑ | ||
---|---|---|---|---|
0
gorlanovmax
30.03.16
✎
12:01
|
Доброго дня.
Столкнулся с задачкой: Есть форма уведомления, в ней есть поле для ввода ФИО, в макете каждая буква этого поля - отдельная ячейка. При этом поле ФИО в макете занимает две строки. В настоящее время реализован вывод ФИО по ячейкам. При этом не учитывается конец первой строки и бывают ситуации, когда ФИО длинное и ЧАСТь отчества переносится на следующую строку (не полностью, а недостающая часть). Раньше где-то натыкался на функцию переноса на следующую строку с учетом длины строки. Сейчас не могу найти. Поле ФИО привел как пример, в макете есть еще аналогичные поля адреса в которых более чем три слова в переменной. Поэтому хотелось бы изобразить универсальную функцию переноса. При этом для корректного отображения в макете, необходимо дополнять первую строку до конца строки пробелами |
|||
1
Ёпрст
гуру
30.03.16
✎
12:03
|
ДлинаСтр в помощь
|
|||
2
Масянька
30.03.16
✎
12:07
|
(0) Функция глРазбитьТекстНаСтрокиДляПечати(мСтрока, мДлинаПечатнойСтроки) Экспорт
ОдинСимволВОстатке = 0; Список = СоздатьОбъект("СписокЗначений"); СтрокаПеч = ""; Разделитель = ""; ДлинаСтроки = СтрДлина(мСтрока); ПолныхСтрок = Цел(ДлинаСтроки / мДлинаПечатнойСтроки); СчетчикПолныхСтрок = 0; Если (ДлинаСтроки > мДлинаПечатнойСтроки) Тогда Для СчетчикСтроки = 1 По ДлинаСтроки Цикл СтрокаПеч = СтрокаПеч + Сред(мСтрока, СчетчикСтроки, 1); ДлинаПечати = СтрДлина(СтрокаПеч); Если (ДлинаСтроки - СчетчикСтроки) = 1 Тогда ОдинСимволВОстатке = 1; СтрокаПеч = СтрокаПеч + Сред(мСтрока, СчетчикСтроки + 1, 1); КонецЕсли; Если ДлинаПечати >= мДлинаПечатнойСтроки Тогда Список.ДобавитьЗначение(СтрокаПеч); СтрокаПеч = ""; СчетчикПолныхСтрок = СчетчикПолныхСтрок + 1; КонецЕсли; Если СчетчикПолныхСтрок = ПолныхСтрок Тогда Прервать; КонецЕсли; КонецЦикла; Если (ОдинСимволВОстатке = 0) Тогда ОстатокСимволов = ДлинаСтроки - СчетчикСтроки; Остаток = Сред(мСтрока, СчетчикСтроки + 1, ОстатокСимволов); Список.ДобавитьЗначение(Остаток); КонецЕсли; КолВоСтрок = Список.РазмерСписка(); НоваяСтрока = Список.ПолучитьЗначение(1); Если КолВоСтрок > 1 Тогда Для Врем = 2 По КолВоСтрок Цикл ТекСтрока = Список.ПолучитьЗначение(Врем); НоваяСтрока = НоваяСтрока + РазделительСтрок + ТекСтрока; КонецЦикла; КонецЕсли; Иначе НоваяСтрока = мСтрока; КонецЕсли; Возврат НоваяСтрока; КонецФункции // глРазбитьТекстНаСтрокиДляПечати |
|||
3
Злопчинский
30.03.16
✎
12:08
|
(0) "При этом для корректного отображения в макете, необходимо дополнять первую строку до конца строки пробелами"
- смысл? как пробелы обозначать будешь? |
|||
4
gorlanovmax
30.03.16
✎
13:43
|
(2) Это вроде оно. Сейчас попробую
|
|||
5
gorlanovmax
30.03.16
✎
13:48
|
(3) Смысл таков
В макете есть две строки по 50 клеток для вывода ФИО функция вывода примерно такова: [code] Функция В(Параметр, Индекс) Если ПустоеЗначение(Параметр)=1 Тогда Возврат ""; КонецЕсли; Пар=СокрЛП(""+Параметр); Если СтрДлина(Пар)<Индекс Тогда Возврат ""; КонецЕсли; Возврат ВРег(Сред(Параметр,Индекс,1)); КонецФункции //В [/code] При этом в ячейках первой строки вызываю функцию от В(Пар1,1) до В(Пар1,50) и во второй строчке от В(Пар1,51) до В(Пар1,100) Т.е. изначально я не делю выводимые данные на две строки. Соотвественно когда я начну делить, мне надо дополнять до длины первой строки пробелы, для корректного вывода |
|||
6
MishaD
30.03.16
✎
13:50
|
(3) чтобы знака переноса не было. А то будет
Злопчинский И Ван Андреевич |
|||
7
gorlanovmax
30.03.16
✎
15:05
|
(2) Нет. Это не то.
Пишу сам, выложу чуть позже |
|||
8
gorlanovmax
30.03.16
✎
15:40
|
Вот так получилось
//мСтрока - строковая переменная для разбиения на строки //мДлинаПечатнойСтроки - список значений, содержащий длины строк макета печати (т.к. они могут быть разными) Функция глРазбитьТекстНаСтрокиДляПечати(мСтрока, мДлинаПечатнойСтроки) Экспорт КолвоСтрок=мДлинаПечатнойСтроки.РазмерСписка(); ДлинаСтроки = СтрДлина(мСтрока); НоваяСтрока=""; ДлинаТекСтроки=мДлинаПечатнойСтроки.ПолучитьЗначение(1); Ном = 1; Если (ДлинаСтроки > ДлинаТекСтроки) Тогда ПромСтрока=СтрЗаменить(мСтрока," ",РазделительСтрок); КолвоСлов=СтрКоличествоСтрок(ПромСтрока); Для н=1 По КолвоСлов Цикл ТекСлово=СтрПолучитьСтроку(ПромСтрока,н); Если (СтрДлина(НоваяСтрока)+СтрДлина(ТекСлово)+1)<=ДлинаТекСтроки Тогда НоваяСтрока=НоваяСтрока+ТекСлово+" "; Иначе ДополнениеСтроки=ДлинаТекСтроки-СтрДлина(НоваяСтрока); Для к=1 По ДополнениеСтроки Цикл НоваяСтрока=НоваяСтрока+" "; КонецЦикла; Ном=Ном+1; Если Ном>КолвоСтрок Тогда Прервать; КонецЕсли; НоваяСтрока=НоваяСтрока+ТекСлово+" "; ДлинаТекСтроки=ДлинаТекСтроки+мДлинаПечатнойСтроки.ПолучитьЗначение(Ном); КонецЕсли; КонецЦикла; Иначе НоваяСтрока=мСтрока; КонецЕсли; Возврат НоваяСтрока; КонецФункции // глРазбитьТекстНаСтрокиДляПечати |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |