Попытка работать с Detail c ResizeText

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Попытка работать с Detail c ResizeText

Сообщение kreator »

Ну а чего мучиться? Экспорт в WinWord, он сам проставит все переносы как надо. Можно потом и пользователю дать возможность что-то там исправить.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Попытка работать с Detail c ResizeText

Сообщение Андрей »

kreator писал(а):Ну а чего мучиться? Экспорт в WinWord, он сам проставит все переносы как надо. Можно потом и пользователю дать возможность что-то там исправить.
да уж все нарисовано с большими мучениями, остается одно это поле с названием услуги победить.
И, все же можно каким то образом узнать в рантайме какая часть текста уместилась в видимой части String ?
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Попытка работать с Detail c ResizeText

Сообщение PavelNK »

GetTextExtentPoint32 поможет узнать длину строки в пикселях, т.е. какая часть строки поместится в контроле или узнать длину контрола для вывода всей строки
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Попытка работать с Detail c ResizeText

Сообщение Андрей »

PavelNK писал(а):GetTextExtentPoint32 поможет узнать длину строки в пикселях, т.е. какая часть строки поместится в контроле или узнать длину контрола для вывода всей строки
Интересно попробовать... Описание ф-ии нашел, а вот как вызвать ? Не опишите примерчик ?
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Попытка работать с Detail c ResizeText

Сообщение kreator »

В файле abprpdf.clw есть и описание и работа с ней. Не уверен, что это правильный путь, функция для работы с экраном, а не с отчётом (в отчёте единицы - дюймы и мм, а функция возвращает значения в экранных единицах).
We are hard at work… for you. :)
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Попытка работать с Detail c ResizeText

Сообщение PavelNK »

Путь-то правильный, единицы переводятся и в дюймы и в мм. Лично юзал, все работает.
Описание есть здесь https://msdn.microsoft.com/ru-ru/librar ... s.85).aspx.
Если найду пример, то напишу.
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Попытка работать с Detail c ResizeText

Сообщение PavelNK »

PavelNK писал(а):Путь-то правильный, единицы переводятся и в дюймы и в мм. Лично юзал, все работает.
Описание есть здесь https://msdn.microsoft.com/ru-ru/librar ... s.85).aspx.
Если найду пример, то напишу.
В смысле там есть описание функции и ссылка на пример использования
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Попытка работать с Detail c ResizeText

Сообщение Андрей »

Мда.... без бутыл..., т.е. примера наверно не разобраться.

Надо ли программно создавать шрифт ? Что такое первый параметр hdc- Дескриптор контекста устройства в применении к репорту и как его получить... через GetDC() ?
Например в репорте в нем есть некий контроль String с USE переменной, скажем l:Name, в которой задан текст.
Может ли GetTExtExtentPoint32 вернуть размеры строки этого контроля - неважно вмещается строка в контроль или нет ?
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Попытка работать с Detail c ResizeText

Сообщение PavelNK »

Блин! Не могу найти пример.
Контекст, получаешь через GetDC. Затем вызываешь
BOOL GetTextExtentPoint32(
_In_ HDC hdc,
_In_ LPCTSTR lpString,
_In_ int c,
_Out_ LPSIZE lpSize
);
в структуре lpSize получаешь размер
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Попытка работать с Detail c ResizeText

Сообщение PavelNK »

Комп глюкнул, не дописал.
Шрифт специально создавать не нужно, он уже задан. Менять его можно как средствами API, так и Кларионом, он тоже работает через API.
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Попытка работать с Detail c ResizeText

Сообщение kreator »

Андрей писал(а):Мда.... без бутыл..., т.е. примера наверно не разобраться.
Посмотри abprpdf.clw из официальной поставки, там всё написано. Только не всё так просто, там перевод PPI в DPI, и ещё какая-то хрень.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Попытка работать с Detail c ResizeText

Сообщение Андрей »

Да, не разбираюсь в этих низкоуровневых.... ну может примерчиком для репорта когда нибудь кто поможет - переделаю....
А сегодня на скорую руку сделал, через одно место....))) , но работатет !

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

Код: Выделить всё

Loop i#=32 to 59
	l:Stroka=''
	Loop j#=60 to 320
		l:Kol=j#
		l:Stroka=all(chr(i#),j#)
		print(rpt:detail1)
	end	
end	
l:Kol - показывает сколько символов выводится в строке (этот цикл уже 2-й, для небуквенных символов)
Загнал полученные рез-ты (визуально полученные) в массив, типа:

Код: Выделить всё

l:KolSimv[192]=103 !А
l:KolSimv[193]=103 !Б
l:KolSimv[194]=103 !В
l:KolSimv[195]=120 !Г
l:KolSimv[196]=103 !Д
l:KolSimv[197]=103 !Е
l:KolSimv[198]=72 !Ж
2. Вывел в реальном отчете в той строке с которой воюю, строку полностью заполненную неким образцовым символом (скажем "б") - посмотрел, сколько влезло - получилось 33.
3. Ну а дальше понятно - каждый символ через к-ты перевожу с образцовому и смотрю, когда нужно делить наименование

Код: Выделить всё

RazobrStr           ROUTINE
 l:VidPlat1=''	
 l:VidPlat2=''
 l:dl=0
 fl2#=0	
 l:PatternKol=l:KolSimv[225]
 len#=len(vyvq:NameUsl)	
 loop jj#=1 to len#
	l:dl+=l:PatternKol/l:KolSimv[VAL(VyvQ:NameUsl[jj#])]
	If l:dl>33
		l:VidPlat2=VyvQ:NameUsl[jj#:Len#]
		l:VidPlat1=VyvQ:NameUsl[1:jj#-1]
		fl2#=1
		break
	end
 END
 if fl2#=0
	l:VidPlat1=VyvQ:NameUsl.	
Попробовал - вроде как нормально переносит, надо только с висячими символами во 2-й строке поработать
Ответить