Страница 2 из 2
Попытка работать с Detail c ResizeText
Добавлено: 26 Апрель 2015, 17:29
kreator
Ну а чего мучиться? Экспорт в WinWord, он сам проставит все переносы как надо. Можно потом и пользователю дать возможность что-то там исправить.
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 11:19
Андрей
kreator писал(а):Ну а чего мучиться? Экспорт в WinWord, он сам проставит все переносы как надо. Можно потом и пользователю дать возможность что-то там исправить.
да уж все нарисовано с большими мучениями, остается одно это поле с названием услуги победить.
И, все же можно каким то образом узнать в рантайме какая часть текста уместилась в видимой части String ?
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 12:35
PavelNK
GetTextExtentPoint32 поможет узнать длину строки в пикселях, т.е. какая часть строки поместится в контроле или узнать длину контрола для вывода всей строки
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 14:21
Андрей
PavelNK писал(а):GetTextExtentPoint32 поможет узнать длину строки в пикселях, т.е. какая часть строки поместится в контроле или узнать длину контрола для вывода всей строки
Интересно попробовать... Описание ф-ии нашел, а вот как вызвать ? Не опишите примерчик ?
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 14:30
kreator
В файле abprpdf.clw есть и описание и работа с ней. Не уверен, что это правильный путь, функция для работы с экраном, а не с отчётом (в отчёте единицы - дюймы и мм, а функция возвращает значения в экранных единицах).
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 16:40
PavelNK
Путь-то правильный, единицы переводятся и в дюймы и в мм. Лично юзал, все работает.
Описание есть здесь
https://msdn.microsoft.com/ru-ru/librar ... s.85).aspx.
Если найду пример, то напишу.
Попытка работать с Detail c ResizeText
Добавлено: 27 Апрель 2015, 16:43
PavelNK
В смысле там есть описание функции и ссылка на пример использования
Попытка работать с Detail c ResizeText
Добавлено: 28 Апрель 2015, 10:59
Андрей
Мда.... без бутыл..., т.е. примера наверно не разобраться.
Надо ли программно создавать шрифт ? Что такое первый параметр hdc- Дескриптор контекста устройства в применении к репорту и как его получить... через GetDC() ?
Например в репорте в нем есть некий контроль String с USE переменной, скажем l:Name, в которой задан текст.
Может ли GetTExtExtentPoint32 вернуть размеры строки этого контроля - неважно вмещается строка в контроль или нет ?
Попытка работать с Detail c ResizeText
Добавлено: 28 Апрель 2015, 12:08
PavelNK
Блин! Не могу найти пример.
Контекст, получаешь через GetDC. Затем вызываешь
BOOL GetTextExtentPoint32(
_In_ HDC hdc,
_In_ LPCTSTR lpString,
_In_ int c,
_Out_ LPSIZE lpSize
);
в структуре lpSize получаешь размер
Попытка работать с Detail c ResizeText
Добавлено: 28 Апрель 2015, 12:30
PavelNK
Комп глюкнул, не дописал.
Шрифт специально создавать не нужно, он уже задан. Менять его можно как средствами API, так и Кларионом, он тоже работает через API.
Попытка работать с Detail c ResizeText
Добавлено: 28 Апрель 2015, 13:08
kreator
Андрей писал(а):Мда.... без бутыл..., т.е. примера наверно не разобраться.
Посмотри abprpdf.clw из официальной поставки, там всё написано. Только не всё так просто, там перевод PPI в DPI, и ещё какая-то хрень.
Попытка работать с Detail c ResizeText
Добавлено: 28 Апрель 2015, 15:19
Андрей
Да, не разбираюсь в этих низкоуровневых.... ну может примерчиком для репорта когда нибудь кто поможет - переделаю....
А сегодня на скорую руку сделал, через одно место....))) , но работатет !
Опишу сей корявый способ, может кому пригодится...
В общем, так -
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-й строке поработать