Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

пОЛУЧИТЬ дЛИНУ кУСКА тЕКСТА, сТРОКИ, сЛОВА, сИМВОЛА в мМ

1.3K
05 апреля 2004 года
zja
119 / / 25.11.2003
пишем фразу в word xp "маша ела кашу" как получить ее длину в чем-нибудь? желательно в мм или см, но сойдет и в "поинтах", на самый тяжелый случай даже в пикселях сойдет. Ответ нужен на vb. Пишу на bcb 6.0 и уперся в принципиальное отсутствие подобных свойств. Если бы кто-нибудь намек дал куда копать на vb, я бы раскопал. Заранее всем спасибо.
RE: почитал окружающие посты, видимо под vb стоит понимать vba, т.к. речь идет именно о word
266
05 апреля 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by zja
пишем фразу в word xp "маша ела кашу" как получить ее длину в чем-нибудь? желательно в мм или см, но сойдет и в "поинтах", на самый тяжелый случай даже в пикселях сойдет. Ответ нужен на vb. Пишу на bcb 6.0 и уперся в принципиальное отсутствие подобных свойств. Если бы кто-нибудь намек дал куда копать на vb, я бы раскопал. Заранее всем спасибо.
RE: почитал окружающие посты, видимо под vb стоит понимать vba, т.к. речь идет именно о word


Честно гоаоря, могу предложить тольео "дубовый" вариант. Использовать только шрифт, в котором все символы одинаковой ширины (типа Tahoma, по-моему) и вычислять длинну исходя из количества символов. Я с такой задачей справлялся в своё время только при помощи перебора....:{

258
05 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Плохо разбираюсь в свойствах Word, но если там ничего хорошего нет, то можно через API.

http://forum.codenet.ru/showthread.php?
s=&threadid=15521&highlight=%F2%E5%EA%F1%F2
1.3K
05 апреля 2004 года
zja
119 / / 25.11.2003
Приведу свою логику, можно задать известному куску текста любой в приципе размер:
Справка Microsoft Visual Basic:
 
Код:
This example fits the current selection into a space five centimeters wide.

Selection.FitTextWidth = CentimetersToPoints(5)

Интерпритация для bcb (это побольшей части для себя, чтоб не сбится):
 
Код:
WordApplication->Selection->set_FitTextWidth(WordApplication->CentimetersToPoints(5));

Неужели невозможен обратный процесс? Буду пробывать еще. Вариант перебора я уже рассматривал, как крайний, т.к. очень не удобный, не практичный и вообще не очень, т.к. преполагается передавать данные из сразу многих форм в один документ и короче на выходе получится огромная некрасивая загагулина кода. Даже если все впихнуть в одну ф-цию. Вариант с API тоже самое. Некрасиво. Как минимум. Юзабилити->0, но при случае буду и так пробовать. Может кто еще что-нибудь предложит.:(
RE: на bcb есть такой интересный момент, если FitTextWidth для selection не задано кодером, то по определению равно 0, а то что текст при этом на 8 листов word вообще не интересует, вот я и подумал, может я что-нибудь не так делаю и(или) на vb/vba таких проблем нет(а просто компонент криво сделан), а видимо не я один такой и это не может не удручать.
258
05 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Не знаю, меня как раз API и устраивает, потому что:
1. код маленький,
2. универсальный (никакие вспомог. библиотеки не нужны)
3. работает быстро и точно.

Насчет проблем. Что касается VB, то тут токо одно решение - это API (если токо см разработчик компонента не напишит через API обсуждаемое свойство).
VBA тоже разная бывает, в Excel'е например тоже приходится использовать API (если ты ищешь конечно не ширину столбца).
Так что ты должен отдавать себе отчет что вариант решения с помощью методов и свойств Word'а будет действовать токо в макросах под Word, или тебе придется подключать библиотеку word к своим программам, но это уже маразм (если твоя программа не использует word, то только ради этого грузить и еще ограничивать себя обязательным установл. word'а на комп.. :() )
1.3K
05 апреля 2004 года
zja
119 / / 25.11.2003
Цитата:
Originally posted by SergeySV
Не знаю, меня как раз API и устраивает, потому что:
1. код маленький,
2. универсальный (никакие вспомог. библиотеки не нужны)
3. работает быстро и точно.


Если бы меня все перечисленное волновало - я не писал бы на bcb. К слову сказать механизм предложенный в файле mdlSysMetrics.bas ничего принципиально нового не дает, это просто вычисление для данного шрифта средней длины символа. Может я чего-то не доглядел, но вроде речь шла о получении дескриптора текста (если такое в принципе можно, но имхо это уже лучше на WIN API запостить, что уже и проделал).
А по теме топа могу сказать, что в поисках справки уже добрался до office.microsoft.com, уже просто спортивный интерес, я не верю, что это принципиально не возможно, причем красиво, а не через одно место... и видимо я не прав, а может ищу не там, ррррр:devil:

258
05 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Ты немного не разобрался :)

Средн. ширина символов нужна была иключительно для Excel'я, потому что у него была нехорошая привычка мерить ширину столбцов в мифических кол-вах символ шрифта по умолч.

В том же модуле, ниже есть независимая удобная функция которая использует API функцию GetTextExtentPoint32 - эта функция возвращает ИТОГОВУЮ РЕАЛЬНУЮ ДЛИНУ/ВЫСОТУ ПЕРЕДАННОЙ ЕЙ СТРОКИ. для вычисления этих данных она использует шрифт который выбран в указанном hdc. Чтобы скрыть от обычных пользователей премудрости использования API функций и была написана VB функция, выполняющая роль обертки - это GetTextPoint, ей достаточно указать имя шрифта и строку, чтобы получить итоговую длину строки.
1.3K
05 апреля 2004 года
zja
119 / / 25.11.2003
хорошо, теперь самый вкусный вопрос как мне это прикрепить к своему проекту?))) шаблон сделать документа в который зашить ф-цию и вызвать ее через оле? уф, что-то я уже почуть чуть плавиться начинаю
КУ: нету там кстати такой ф-ции, это так о птичках
RE2:скачай файлик - давай посмеемся вместе и GetTextExtentPoint32 вообще в тексте не упоминается нигде даже, может ссылка не та, хотя тут вообще по офису не так много ссылок, хм
RE: а вот за наводку на нужную ф-цию спасибо, я ее скорее сам прикручу, хотя если вдруг таки проясниться возможность применения твоей ф-ции, буду очень признателен
258
05 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
в этом модуле оставил только то что тебе нужна, там одна указанная выше public функция и комментария к ней.
1.3K
05 апреля 2004 года
zja
119 / / 25.11.2003
Цитата:
Originally posted by SergeySV
в этом модуле оставил только то что тебе нужна, там одна указанная выше public функция и комментария к ней.


Большое спасибо. Я еще забегу с вопросиками))) потом.

258
06 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by zja

Большое спасибо. Я еще забегу с вопросиками))) потом.



В принципе, если ты найдешь в Word'е возможность получить длину текста в point, см. или еще в чем угодно, будет не проблема перевести их пиксели или еще во что.

Моя функция в примере рассчитывает длину текста одним шрифтом с указанием размера, но не учитывает курсив, насыщенность. Это доп. параметры можно задать в самой API функции, я там по умолч. задаю эти доп. характеристики по умолч.. Мне просто это не надо было, а ты можешь расширить VB функцию и добавить в нее эти доп. переменные передавая их в API GetTextExtentPoint32.

Ну вообщем, если ты хочешь узнать обо всех возможностях API GetTextExtentPoint32, то советую почитать на MSDN, там все достаточно подробно описано, тем более что пример использования на VB у тебя перед глазами.

258
06 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by SergeySV


В принципе, если ты найдешь в Word'е возможность получить длину текста в point, см. или еще в чем угодно, будет не проблема перевести их пиксели или еще во что.

Моя функция в примере рассчитывает длину текста одним шрифтом с указанием размера, но не учитывает курсив, насыщенность. Это доп. параметры можно задать в самой API функции, я там по умолч. задаю эти доп. характеристики по умолч.. Мне просто это не надо было, а ты можешь расширить VB функцию и добавить в нее эти доп. переменные передавая их в API GetTextExtentPoint32.

Ну вообщем, если ты хочешь узнать обо всех возможностях API GetTextExtentPoint32, то советую почитать на MSDN, там все достаточно подробно описано, тем более что пример использования на VB у тебя перед глазами.



Блин, перлепутал немного, речь идет конечно о функции API CreateFont, которая и создает в памяти фонт с нужными характеристиками, а GetTextExtentPoint32 уже только измеряет получившиюся длину.

1.3K
17 апреля 2004 года
zja
119 / / 25.11.2003
2 замечено особенности, если можно так сказать: 1. размер возвращаемых поинтов(1 дюйм = 72 поинта) не соответствует действительности. наверное я где-то ошибся, когда переводил с твоего примера на bcb, но это на самом деле мелочи, т.е. получается некоторое шрифто зависимое число, а коэффициент его к см можно и эмпирически посчитать. 2. Возможно из той же ошибки, а может так оно и на самом деле, но число поинтов занимаемых табуляцией, даже если она на пол листа=числу поинтов переноса строки=12, и что-то мне подсказывает, что и для простого пробела будет тоже самое, что разумеется действительности не соответствует.
RE: возможно проблема в nSize (PointSize если следовать MSDN), поигаюсь
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог