Страница 1 из 1

Расчёт ширины строки

Добавлено: 20 Декабрь 2017, 21:49
Игорь Столяров
Привет всем !

Существует ли какой-то алгоритм (или методика) расчёта ширины строки символов текущим шрифтом ?

Пример:
- В окне показана символьная строка, ширина (Width) строки известна.
- Строке присваиваются различные наименования из БД;
- Требуется на момент показа знать, отобразилось наименование полностью или оно
обрезано из-за недостатка места (ну и вывести предупреждение или поменять цвет строки и т.д.)

Для моноширинного шрифта (Courier, Consolas и т.д.), методом тыка можно подобрать коээфициент
связи кол-ва символов в строке и её ширины. Но что делать с "обычными" Arial, Times и т.д. шрифтами ?

Какой-то тупик. :( Буду благодарен за любую наводку.

Расчёт ширины строки

Добавлено: 20 Декабрь 2017, 21:57
Дед Пахом
Вот здесь например: https://stackoverflow.com/questions/172 ... -in-pixels

Расчёт ширины строки

Добавлено: 20 Декабрь 2017, 22:19
Игорь Столяров
Как я понял, там та же методика, что в Clarion используется для определения размера картинки.
Т.е. вывести "как есть" и потом получить размер того что вывелось ...

Можно попробовать заюзать это со строкой с шириной Default ...
Даже не представляю, будет менять строка ширину в зависимости от текста или нет. :)
Буду пробовать. Спасибо ! :)

Расчёт ширины строки

Добавлено: 20 Декабрь 2017, 22:21
Дед Пахом
Кстати, можно без всякого API. Создаём строку CREATE(0, create:string), присваиваем ей шрифт и значение, получаем длину, делаем DESTROY.

Расчёт ширины строки

Добавлено: 20 Декабрь 2017, 23:12
finsoftrz
Можно просто скрытую строку использовать...

Расчёт ширины строки

Добавлено: 21 Декабрь 2017, 8:59
Игорь Столяров
Дед Пахом писал(а): 20 Декабрь 2017, 22:21Кстати, можно без всякого API. Создаём строку CREATE(0, create:string), присваиваем ей шрифт и значение, получаем длину, делаем DESTROY.
Спасибо - всё работает.
В моём случае - все параметры строки наследуются из родительского окна:

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

  i# = Create(0,Create:String)

  If i#
     i#{Prop:Text} = 'Маленькой ёлочке холодно зимой'
     Message(Len(Clip(i#{Prop:Text})) & ' -> ' & i#{Prop:Width})

     i#{Prop:Text} = 'ЖШЩЮШШШШWWWMMMMZZZUUUUUФФЫЫЫЫЫ'
     Message(Len(Clip(i#{Prop:Text})) & ' -> ' & i#{Prop:Width})
  end

  Destroy(i#)