Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / [игнор отключен] [закрыт для гостей] / Макет отчета: как разбить строку произвольного текста на фрагменты? / 16 сообщений из 16, страница 1 из 1
16.10.2012, 04:34
    #37999586
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Снова приветствую!

Есть макет отчета, в который выводится, например, получатель документов.
Если наименование получателя шибко длинное - тут есть свойство ячейки "Переносить по словам" (вроде, так). Тогда в ячейку влезет всё, а сама она подрастет в высоту.

А вот как быть со случаями, когда надо это наименование разбить на несколько фрагментов, которые поместились бы по ширине в фиксированной ширины ячейку? Т.е. надо как-то длинное наименование разместить в несколько строк, представленных на картинке-примере. Видно, что минимальное количество строк - 4, но возможно увеличение этого количества, в зависимости от длины строки, которую надо в них разместить.

Как быть? Сталкивался кто?

Ваяю: MS Access 2003, mdb | VB.NET + mdb/SQL Express | 1С 8.2.14, тонкий клиент, управляемое приложение
...
Рейтинг: 0 / 0
16.10.2012, 07:17
    #37999617
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Пиши функцию которая бы разбила строку и возвратила бы массив строк. Можно написать как рекурсией, так и с помощью типовых функций работы со строкой. Функции split в 1С нет.
...
Рейтинг: 0 / 0
16.10.2012, 10:19
    #37999806
AHDP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Используйте моноширинный шрифт и подстроки.
ЗЫ Многие правилами и знаками переноса не заморачиваются.
...
Рейтинг: 0 / 0
16.10.2012, 11:50
    #38000052
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
SashaMПиши функцию которая бы разбила строку и возвратила бы массив строк
От этого и хотел уйти...

AHDPИспользуйте моноширинный шрифт и подстроки.
ЗЫ Многие правилами и знаками переноса не заморачиваются.
Моноширинка навряд ли пойдет... Документ будет смотреться немонолитно. Я сторонник эстетики. =)
А что такое "подстроки"?
...
Рейтинг: 0 / 0
16.10.2012, 12:01
    #38000078
AHDP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Лев(), Сред(), Прав().
А иначе вы ширину не угадаете и не отследите.
ЗЫ Меня устраивали напечатанные на машинке документы, да и форум вполне прилично выглядит. ;)
...
Рейтинг: 0 / 0
16.10.2012, 12:03
    #38000084
Kreontsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Да что тут делать, у тебя ж шаблон всегда на 4-ре строки:
Перем ДлиннаяСтрока;

кусок1 = Сред(ДлиннаяСтрока,1,50);
кусок2 = Сред(ДлиннаяСтрока,51,50);
кусок3 = Сред(ДлиннаяСтрока,101,50);
кусок4 = Сред(ДлиннаяСтрока,151);// а вот если еще больше, тогда не влезет :)

Вместо 50-только подобрать надо сколько для строки надо
...
Рейтинг: 0 / 0
16.10.2012, 12:37
    #38000172
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
KreontsaДа что тут делать, у тебя ж шаблон всегда на 4-ре строки:
Перем ДлиннаяСтрока;

кусок1 = Сред(ДлиннаяСтрока,1,50);
кусок2 = Сред(ДлиннаяСтрока,51,50);
кусок3 = Сред(ДлиннаяСтрока,101,50);
кусок4 = Сред(ДлиннаяСтрока,151);// а вот если еще больше, тогда не влезет :)

Вместо 50-только подобрать надо сколько для строки надо

Дык я так и сделал. А запостился во имя поиска более оптимальных решений.
Единственное, я не тупо режу строку по длине, а беру макс.символов, влезающих в строку, и иду посимвольно назад в поисках пробела, чтобы по словам переносить. =)
...
Рейтинг: 0 / 0
16.10.2012, 12:40
    #38000179
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Хотя, если честно, смысла не вижу в этих межстрочных подсказках мелким шрифтом... Ну почему я в настроенном макете, заполняющемся программно, должен реализовывать подсказки, предназначенные для ручного заполнения?! Но - заказчик хочет. Блинский!
...
Рейтинг: 0 / 0
16.10.2012, 12:45
    #38000196
Kreontsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
ети подсказки скорей всего "кемто" утвержд.бланк :)
...
Рейтинг: 0 / 0
16.10.2012, 12:56
    #38000220
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Kreontsaети подсказки скорей всего "кемто" утвержд.бланк :)
В том-то и беда, что Вы правы. =) Я, конечно, никто - для того чтобы судить подобные изыски, - но ИМХО это мусор, который а) "ломает" читабельность документа, б) занимает место на бумаге да и в) просто не нужен в условиях автозаполнения документа.

Если я получаю Свидетельство на право собственности, к примеру, мне ведь (да и прочим "органам") важны те сведения, которые написаны крупным шрифтом:
Документ...земельный участок, категория земель - земли населенных пунктов, вид разрешенного использования - для индивидуального жилищного строительства, площадь - 2500 кв.м ... внесена регистрационная запись № 55/55-5555-555555 от 11.11.1111 г. ...

ВСЁ! И до банана всем, что Управление Росреестра по Ленинградской области - это (судя по подсказке) "орган, уполномоченный на регистрацию прав на недвижимое имущество и сделок с ним" (как-то так). А программа сама разберется, куда ей какие сведения впихуять.

Не? =)
...
Рейтинг: 0 / 0
16.10.2012, 20:14
    #38001259
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Намутил функцию для универсальности:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//Функция нарезает передаваемую в нее строку произвольной длины на массив строк, длина
//каждой из которых не превышает заданную длину. Перенос осуществляется по словам.
Функция НарезатьТекстНаСтрокиОпределеннойДлины(ИсходныйТекст,МаксДлинаСтроки) Экспорт
	Результат = Новый Массив;
	Конец = Ложь;
	НачалоСтроки = 1;
	Пока НЕ Конец Цикл
		Строка = Сред(ИсходныйТекст,НачалоСтроки,МаксДлинаСтроки);
		Если НЕ СтрДлина(Строка) < МаксДлинаСтроки Тогда
			ПроверяемаяПозиция = МаксДлинаСтроки;
			Пока НЕ Сред(Строка,ПроверяемаяПозиция,1) = " " И НЕ Сред(Строка,ПроверяемаяПозиция,1) = "-" Цикл
				ПроверяемаяПозиция = ПроверяемаяПозиция - 1;
			КонецЦикла;
			Строка = Лев(Строка,ПроверяемаяПозиция);
		Иначе 
			Конец = Истина;
		КонецЕсли; 
		Результат.Добавить(Строка);
		НачалоСтроки = НачалоСтроки + ПроверяемаяПозиция;
	КонецЦикла; 
	Возврат Результат;
КонецФункции



Из известных косяков: не учел случаи, когда макс.длина строки меньше длины одного слова. Например, если максимальная длина строки равна 10 символам, а попалось слово длиной >=10 символов, то вылетит с ошибкой. Но мне таких случаев не видать.
...
Рейтинг: 0 / 0
16.10.2012, 21:07
    #38001320
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Вот, для наглядности закинул на Яндекс.Диск 5-метровую видяшку на полторы минуты для демонстрации того, как все настроено и как выглядит описываемая ошибка.

Слезно прошу помочь...
...
Рейтинг: 0 / 0
16.10.2012, 21:15
    #38001328
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
КириллНВот, для наглядности закинул на Яндекс.Диск 5-метровую видяшку на полторы минуты для демонстрации того, как все настроено и как выглядит описываемая ошибка.

Слезно прошу помочь...

Блин, не в тот топик...
...
Рейтинг: 0 / 0
17.10.2012, 04:13
    #38001574
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
КириллННамутил функцию для универсальности:
Это не намутил... более мутная функция это моя... она учитывает что слово может не влазить в максимальную длину и берет слово целиком.

PS: Функция написана с помощью рекурсии и не является оптимальной как с точки зрения ресурсов так и скорости.
...
Рейтинг: 0 / 0
17.10.2012, 10:53
    #38001876
SashaM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
Небольшая оптимизация кода:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Функция РазбитьСтроку( Знач РазбиваемаяСтрока, Знач ДлиннаСтроки, МассивСтрок = Неопределено, НачальнаяДлинна = Неопределено )

	Если МассивСтрок = Неопределено Тогда
		МассивСтрок = Новый Массив;
		НачальнаяДлинна = ДлиннаСтроки;
	КонецЕсли;

	Если СтрДлина( РазбиваемаяСтрока ) > ДлиннаСтроки Тогда

		Если Сред( РазбиваемаяСтрока, ДлиннаСтроки, 1 ) = " " Тогда
			МассивСтрок.Добавить( Лев( РазбиваемаяСтрока, ДлиннаСтроки ) );
			ПоискПробела = СокрЛ( Сред( РазбиваемаяСтрока, ДлиннаСтроки ) );
			ДлиннаСтроки = НачальнаяДлинна;
			РазбитьСтроку( ПоискПробела, ДлиннаСтроки, МассивСтрок, НачальнаяДлинна );
		Иначе
			ПоискПробела = Лев( РазбиваемаяСтрока, ДлиннаСтроки );
			ДлинаСловаБольшеОграничения = Истина;

			Для Индекс = ?( ДлиннаСтроки = НачальнаяДлинна, 1, ДлиннаСтроки ) По ДлиннаСтроки Цикл
				Если Сред( ПоискПробела, ДлиннаСтроки - Индекс, 1 ) = " " Тогда
					МассивСтрок.Добавить(  СокрЛП( Лев( РазбиваемаяСтрока, ДлиннаСтроки - Индекс ) ) );
					РазбитьСтроку( СокрЛ( Сред( РазбиваемаяСтрока, ДлиннаСтроки - Индекс ) ), ДлиннаСтроки, МассивСтрок, НачальнаяДлинна );
					ДлинаСловаБольшеОграничения = Ложь;
					Прервать;
				КонецЕсли;

			КонецЦикла;

			Если ДлинаСловаБольшеОграничения Тогда
				РазбитьСтроку( РазбиваемаяСтрока, ДлиннаСтроки + 1, МассивСтрок, НачальнаяДлинна );
			КонецЕсли;

		КонецЕсли;

	Иначе
		МассивСтрок.Добавить( СокрЛП( РазбиваемаяСтрока ) );
		ДлиннаСтроки = НачальнаяДлинна;

	КонецЕсли;

	Возврат МассивСтрок;

КонецФункции
...
Рейтинг: 0 / 0
17.10.2012, 17:06
    #38002957
КириллН
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Макет отчета: как разбить строку произвольного текста на фрагменты?
SashaM,

Крутяк. =) Только сложновато для восприятия.
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Макет отчета: как разбить строку произвольного текста на фрагменты? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]