![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]()
Подскажите, пожалуйста, может ли отличаться ширина выводимого текста (трутайп), при выводе её на разные канвы (разные устройства)?
как там в теории? ![]() Моя программа строит таблицу и рисует в ячейках текст. Причём пользователь редактирует часть таблицы (добавляемый элемент), на одной форме, а результат будет выводиться в совершенно другое место (конкретно - компонент TPrintPreview, от Delphi AREA). При вводе пользователем текста программа сама рассчитывает его ширину и обрезку, чтобы он влез в ячейку, используя метод канвы формы ввода. Но где гарантия, что при выводе на другую канву он в эту ячейку влезет? Более того - я попытался написать "универсальную" функцию для вычисления ширины текста. Код:
|
![]() |
![]() |
![]() |
#2 |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
Не стал читать до конца. Скажу лишь, что у битмапа в Дельфи есть методы по определению размеров области занимаемой текстом.
По поводу ячейки, в вин апи есть функция к-рая красиво заканчивает строку точками если та не влазит в область. Также можно сделать показ хинта с полным текстом при наведении на ячейку, в нек-рых контролах (TListView например) это уже реализовано.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]()
Да, пожалуй, я загнул, уже вечером пока шёл домой, понял, что задвинул какую-то нудятину
![]() Сделаю покороче, без воды: Имеется "универсальная" процедура, которая выводит фигуру, в любую канву, вроде такой: Код:
Есть ли у меня гарантии, что при подстановке в процедуру канвы другого объекта (принтер, например) - текст будет находиться в прямоугольнике? ps Предполагаю, что у у каждой канвы свои настройки "по умолчанию", поэтому видоизменяю процедуру, устанавливая, по-моему, главные параметры: Код:
|
![]() |
![]() |
![]() |
#4 | ||
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]() Цитата:
![]() Цитата:
![]() Последний раз редактировалось AnTe; 17.06.2009 в 14:20. |
||
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]()
Плюнул, короче на это дело.
Пи автоматическом расчёте положения, для получения ширины умножаю ширину шрифта, на количество букв. Вычисления ширины, с созданием временного битмапа и использования его метода TextWidth отличается от значения ширины, полученного непосредственно перед выводом ![]() Вывод в разные канвы покамест даёт с виду одинаковые результаты. |
![]() |
![]() |
![]() |
#6 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
Немного не так я делал, хотя задача у меня была другая - динамичный лейбел. В этой функции как раз определение габаритов текста.
Код:
Цитата:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 23.06.2009 в 01:03. |
|
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]()
Ну да, когда канва есть - можно и TextExtent использовать. Кстати, вроде его borland и вызывает, для расчёта Canvas.TextWidth
Цитата:
При сильных сплющиваниях погрешность "метода" возросла, в разы. Вернулся к старой схеме: создаю временный битмап, его канву использую, для вызова Canvas.TextWidth. Теперь, что по делу. Выкопал из компоненты код, что за канва используется у них. Вот тестовый пример. Процедуру, в которой назначаются параметры шрифта, и рассчитывается его ширина, для любой канвы, вынес в отдельную: Код:
Код:
|
|
![]() |
![]() |
![]() |
#8 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]()
Не берусь судить, вижу что вы мокнулись в это куда глубже чем я.
Однако вижу в коде TMetafileCanvas а не TCanvas. Возможно поэтому и разные результаты. Если использовать объект одного и того же типа, то по идее не должны отличаться результаты. А если здесь параметр такого же типа применить? procedure Test_ShowTextWidthOnAnyCanvas(Canvas: TMetafileCanvas); Цитата:
Код:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог Последний раз редактировалось mutabor; 23.06.2009 в 12:37. |
|
![]() |
![]() |
![]() |
#9 | ||
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]() Цитата:
Цитата:
![]() Только после отработки всех трёх процедур начинаются чудеса. |
||
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 25.09.2008
Сообщений: 209
|
![]()
После длительных экспериментов, выяснилось, что значение меняется, если в SetViewPortExtEx передаются меньшие координаты, например:
SetMapMode(ACanvas.Handle, MM_ANISOTROPIC); SetWindowExtEx(ACanvas.Handle, 10, 10, nil); SetViewPortExtEx(ACanvas.Handle, 1, 1, nil); В общем, перед ними ширина текста 8812 после них 8760 уменьшилась на 52 единицы Последний раз редактировалось AnTe; 23.06.2009 в 13:26. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вызов произвольной функции из DLL | Роман Радер | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 31 | 05.03.2010 22:35 |
Построить график произвольной функции | HECTOR.A. | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 05.06.2009 23:55 |
Построить график произвольной функции | HECTOR.A. | Помощь студентам | 0 | 05.06.2009 22:27 |
очистка канвы | Juffin | Общие вопросы Delphi | 1 | 17.05.2009 14:44 |
выделение произвольной области на изображении | seregaAV110 | Помощь студентам | 2 | 16.11.2008 11:46 |