Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

Преобразование Width в Length   Найти похожие ветки 

 
Arazel ©   (2005-10-29 20:49) [0]

Помогите вычислить длину текста по Width?


 
Eraser ©   (2005-10-29 20:52) [1]


> Arazel ©   (29.10.05 20:49)

TCanvas.TextWidth


 
Arazel ©   (2005-10-29 20:58) [2]

Eraser ©   (29.10.05 20:52) [1]
Я перепутал на оборот =\


 
Arazel ©   (2005-10-29 21:00) [3]

Помогите вычислить длину текста в  симолах по Canvas.TextWidth?


 
Eraser ©   (2005-10-29 21:07) [4]


> Arazel ©   (29.10.05 21:00) [3]

Издеваешься?


 
isasa ©   (2005-10-29 22:13) [5]

Eraser ©   (29.10.05 21:07) [4]
Издеваешься?


:)
Шрифт моноширинный, пропорциональный, гарнитура, кегль, ...
Сумма ширин символов + межсимвольное, в зависимоти от см 1-й абзац ....


 
Юрий Зотов ©   (2005-10-30 05:47) [6]

> Arazel ©   (29.10.05 21:00) [3]
> Помогите вычислить длину текста в  симолах по Canvas.TextWidth?

При немоноширинном шрифте длина разного текста будет разной, поэтому задача общего решения не имеет.

А при моноширинном шрифте можно так:

S:= "";
N := 0
W := Canvas.ClipRect.Right - Canvas.ClipRect.Left;
while Canvas.TextWidth(S) < W do
begin
 S := S + "a";
 Inc(N)
end;
if Canvas.TextWidth(S) <> W then
 Dec(N);


 
homm ©   (2005-10-30 07:05) [7]


>  задача общего решения не имеет.

Отнюдь!


TR: TRect;

TR := MakeRect(0, 0, KnownWidth + Canvas.TextWidth ("..."), Canvas.TextHeight(MyString))
DrawText (Canvas.Handle, MyString, -1, TR, DT_SINGLELINE or DT_MODIFYSTRING or DT_END_ELLIPSIS);

После этого MyString будет содержать максимальное количество символов, помещающееся в указаную длину. Единственный недостаток - на канве будет текст, поэтому TR задай выше верхней граници видимости.


 
Anatoly Podgoretsky ©   (2005-10-30 11:04) [8]

Много, много проще, никаких преобразований не требуется, сам текст уже имеет всю информацию и нет нужды преобразовывать его через Width, просто использовать функцию Length


 
sniknik ©   (2005-10-30 11:08) [9]

homm ©   (30.10.05 07:05) [7]
по вопросу нужно не максимальное, а точное...
ну допустим вычислил ты что в длинну 100 влазит 30 символов "."
а в тексте на самом деле находится 10-18 "Щ"
"ЩЩЩЩЩЩЩЩЩЩ"

и потом точка это не самое минимальное, к примеру (если получится в отображении на сайте)
точки 30символов
"............................."
а сдесь 36 спаренных... (в редакторе они одинаковой длинны, как в отображении счас посмотрим )
&#803;"&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729 ;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;&#803;&#729;"


 
sniknik ©   (2005-10-30 11:12) [10]

вроде получилось. только точку с запятой и пробел почемуто вставило в разыв строки (я не задавал), там только пары - точка вверху с точкой внизу.
скинь в редактор убери, будут одинаково сточками по длинне но на 6 символов больше по количеству.


 
Arazel ©   (2005-10-30 11:28) [11]

Элементарно:

Есть кнопка, размер кнопки: Width – 98, Height – 22
Так вот как мне предварительно узнать по Width
сколько символов в Caption поместится?


 
Zacho ©   (2005-10-30 11:58) [12]

Arazel ©   (30.10.05 11:28) [11]

Тебе уже сказали, что это возможно только для моноширинных шрифтов. И даже код привели в Юрий Зотов ©   (30.10.05 5:47) [6]

А вот обратную задачу (узнать размеры контрола, необходимые для того чтобы в него полность поместился определённый текст) решить очень просто - вызвать DrawText c флагом DT_CALCRECT


 
Юрий Зотов ©   (2005-10-30 13:46) [13]

> homm ©   (30.10.05 07:05) [7]

Спасибо Вам за то, что подтвердили практическим примером мои слова о том, что "При немоноширинном шрифте длина разного текста будет разной, поэтому задача общего решения не имеет", приведя код, результат которого будет зависеть от содержимого строки MyString.

:о)


 
XProger ©   (2005-10-30 15:00) [14]


  old := SelectObject(h_DC, font);
  GetTextExtentPoint32(h_DC, Str, length(Str), sz);
  SelectObject(h_DC, old);
  Result := sz.cx;


 
Юрий Зотов ©   (2005-10-30 15:03) [15]

> XProger ©   (30.10.05 15:00) [14]

Спасибо Вам за то, что подтвердили практическим примером мои слова о том, что "При немоноширинном шрифте длина разного текста будет разной, поэтому задача общего решения не имеет", приведя код, результат которого будет зависеть от содержимого строки Str.

:о)


 
Arazel ©   (2005-10-30 15:33) [16]

Всем спасибо  особенно homm ©   (30.10.05 07:05) [7]


 
homm ©   (2005-10-30 17:18) [17]

Пожалуста Юрию зотову что подтвердил его теорию, он теперь может даже книгу напишет где научно обоснует, и ОГРОМНОЕ пожалуста Arazel © что смог помоч ;)

PS Надо бы еще одиу вкладку форума сделать. Задаеш там вопрос, а тебе аргументировано доказывают, что начальные условия не верны, и задача не имеет общего решения.


 
sniknik ©   (2005-10-30 17:59) [18]

homm ©   (30.10.05 17:18) [17]
> что подтвердил его теорию
вообщето это не теория это факт.

> пожалуста Arazel © что смог помоч ;)
уверен что помог? вопрос был один, ответ дает не то что задано, возможно конечно вопрос коряво задан и ответ именно нужный, а если нет? и на базе неверных знаний будет написана программа, а после будет глюк и будет долгое выяснение причин... возможно будет потрачено гораздо больше времени чем сейчас понять и сделать правильно.

> и задача не имеет общего решения.
она действительно не имеет общего решения, частные да. но вопрос то об общем.

вообще это новое слово в математике - зная только сумму ряда чисел, расчитывают этот ряд в обратку... (сумма 1 число, ряд > 1000 чисел и т.д. с +. крутейший архиватор можно сделать ;о)))


 
Юрий Зотов ©   (2005-10-30 19:07) [19]

> homm ©   (30.10.05 17:18) [17]

Еще раз спасибо, теперь уже за совет. Но я, пожалуй, все же ему не последую и книгу писать не стану. Поскольку нет смысла - книги на эту тему уже давно написаны и остается только их читать.

Есть есть большое желание убедиться, что при немоноширинном шрифте задача общего решения действительно не имеет, можете прогнать свой код при разном содержимом строки, сравнить результаты и убедиться, что они зависят от этого самого содержимого.

А чтобы убедиться в этом наглядно, можете даже запустить вот эту простенькую программку:

procedure TForm1.FormActivate(Sender: TObject);
const
 N = 10;
var
 S: string;
 Ch: char;
 i: integer;
begin
 SetLength(S, N);
 for Ch := "a" to "z" do
 begin
   for i := 1 to N do
     S[i] := Ch;
   ListBox1.Items.Add(S)
 end
end;

и с удивлением обнаружить, что в прямоугольнике шириной, например 30 пикселей умещается разное количество разных символов (например "i" и "m").

О чем и было сказано.


 
Antonn ©   (2005-10-30 19:14) [20]

Arazel ©   (30.10.05 11:28) [11]
я так понял, что требуется просто узнать, сколько символов из caption"а поместится на кнопке, т.е. где его обрезать. В принципе Canvas.TextWidth хватит...


 
homm ©   (2005-10-30 19:31) [21]


> sniknik ©   (30.10.05 17:59) [18]
>
> > что подтвердил его теорию
> вообщето это не теория это факт.

Да.


> уверен что помог?

Arazel> Всем спасибо  особенно homm


> вообще это новое слово в математике - зная только сумму
> ряда чисел, расчитывают этот ряд в обратку... (сумма 1 число,
>  ряд > 1000 чисел и т.д. с +. крутейший архиватор можно
> сделать ;о)))

вообще это старое слово в математике - зная частичную сумму ряда чисел и все члены ряда расчитать количество членов в этой частичной сумме.
( -. Евгений Рошал спит спокойно :-\  )

2 Arazel
Совсем забыл, что из получившейся длины строки нужно вычесть три (три точки в конце строки).


 
sniknik ©   (2005-10-30 20:25) [22]

homm ©   (30.10.05 19:31) [21]
> вообще это старое слово в математике - зная частичную сумму ряда чисел и все члены ряда расчитать количество членов в
>  этой частичной сумме.
см.
sniknik ©   (30.10.05 17:59) [18]
>> и задача не имеет общего решения.
> она действительно не имеет общего решения, частные да. но вопрос то об общем.

ты не нашол длинну строки из ширины, а обрезал существую строку под заданную ширину (т.е. частность).

вот возми свой же пример, и проверь

TR: TRect;

MyString:= "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii";
TR := MakeRect(0, 0, 50 + Canvas.TextWidth ("..."), Canvas.TextHeight(MyString))
DrawText (Canvas.Handle, MyString, -1, TR, DT_SINGLELINE or DT_MODIFYSTRING or DT_END_ELLIPSIS);
Label1.Caption:= MyString;

MyString:= "MMMMMMMMMMMMMMMMMM";
TR := MakeRect(0, 0, 50 + Canvas.TextWidth ("..."), Canvas.TextHeight(MyString))
DrawText (Canvas.Handle, MyString, -1, TR, DT_SINGLELINE or DT_MODIFYSTRING or DT_END_ELLIPSIS);
Label2.Caption:= MyString;

длинна (судя по твоим словам) будет одинакова... я в это не верю, и предлагаю проверить.
твои слова перед примером?
homm ©   (30.10.05 07:05) [7]
>>  задача общего решения не имеет.
> Отнюдь!
или отказываешся? (отрицание на то что не имеет, значит то что обшее решение имеется. верно?)


 
homm ©   (2005-10-30 21:35) [23]

Вы сами придумали такую задачу.
Исходные данные другие:

> Arazel ©   (30.10.05 11:28) [11]
>
> Элементарно:
>
> Есть кнопка, размер кнопки: Width – 98, Height – 22
> Так вот как мне предварительно узнать по Width
> сколько символов в Caption поместится?

Я так понимаю это нужно было для того чтобы последняя буква либо рисовалась, либо нет совсем, а не обрезалась. Если бы задача напрмер стояла ограничеть количество вводимых символов, то можно было бы на месте проверять, после каждого введенного символа, влезает ли он и обрезать его если нет. В любом случае речь идет о конкретной строке. Что строка не известна вы додумали сами! Жаль что у вас не хватило смекалки додумать что Width тоже не известен (вот уж действительно архиватор - частичная сумма не извесна, найти число членов ряда в этой сумме).

> вот возми свой же пример, и проверь
......

Ну что ты распинаешся. Я уже сказал Да (читать предидущий пост). Я об этом есс-но осведомлен. Лучше бы ты так же досканально пытался решить задачу, а не доказать ее нерешаемость.


 
Юрий Зотов ©   (2005-10-30 22:13) [24]

> homm ©   (30.10.05 21:35) [23]

Неправомерно ссылаться на постановку задачи в [11], потому что [6] и [7] появились раньше. Ссылаться надо на сабж, [2] и [3], а там сказано совсем другое.


 
sniknik ©   (2005-10-30 22:30) [25]

> Ну что ты распинаешся. Я уже сказал Да (читать предидущий пост). Я об этом есс-но осведомлен.
дело принципа, если сказано что белое то это именно белое а не бежевовое или очень очень светло серое.
особенно если ктото после сказал "нет, это белое", а показал светлозеленое.

сказал бы вместо "отнюдь" (отрицание всего что говорилось до/ т.е. попросту белое черным обозвал), "а возможно ему надо вот это...". и никаких вопросов/претензий к тебе бы не было (от меня точно).

> Лучше бы ты так же досканально пытался решить задачу, а не доказать ее нерешаемость.
кому лучше, мне? нет, мне не лучше. мое имхо в том, что лучше научить народ на форуме правильно вопросы задавать... т.к. правильно заданный вопрос это половина решения. и возможно в процессе составления правильного половина народа сама ответ найдет. вот это правильно.
а неправильно заданный/неопределенный это треп, тоже неплохо, живое общение... но это неправильно.


 
homm ©   (2005-10-30 23:20) [26]

Если вы говорите что неправомерно ссылатся на [11], подразумевается что после [11] вы поняли задачу. Тогда какого вы пишете в [13] что задача (придуманая вами опять же) не имеет решения, и продолжаете в [19].


> кому лучше, мне? нет ...

Вот именно что вам лучше народ учить вопросы задавать, и убеждать в их неправильности вопроса. А тому кто задает вопрос лучше получить ответ на него. Игоизм.

Примечание
> как мне предварительно узнать по Width сколько символов в Caption поместится?
Ключевое слово поместится. Это значит что мы их туда помещать будем, а не считывать уже поместившиеся или что-то еще. А помещать абстактную, неизвестную строку в принципе абсурд. Она будет известна после получения и до помещения, вот тут то мы и сосчитаем ее...

То что не имеет решения  - задача ВАША. (Если надо в следующем посте это еше раз напишу, как сказал sniknik это дело принципа).


 
Юрий Зотов ©   (2005-10-30 23:51) [27]

> homm ©   (30.10.05 23:20) [26]

Вот-вот. Какого же Вы вставили свое "отнюдь"?

Я сказал, что в том виде, в котором задача сформулирована, она общего решения не имеет. Вы возразили. Тем не менее, этого самого общего решения не только не привели (и понятно, почему), но и в итоге признали, что да, общего решения нет.

Так что? Выходит, я был прав. А Вы - нет. И пишите еще хоть сто постов хоть из тысячи принципов, от этого ничего не изменится.

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

Ферштейн?

И гуд бай на этом.


 
homm ©   (2005-10-31 00:48) [28]

Вы додумали свою задачу и пришли к тому что решения нет. Я свою и пришел к решению. Вы правы а я нет. Почему?

> Я сказал, что в том виде, в котором задача сформулирована
В каком виде она додумана вами. А я возразил что решение имеит задача как она представилась мне (ну нет в [2][3] явного указания на извесность строки). Потом согласился что ВАША задача и правда решения не имеет. Так уж получилось, что когда условие было уточнено прав оказался я. Еще раз: к чему тогда [13] и [19]? Упреки что я не решил ВАШУ задачу?

sniknik ©   (30.10.05 11:08) [9]
Ты наверное до сих пор думаеш, что я количество точек считал? Наивный...


 
sniknik ©   (2005-10-31 08:14) [29]

homm ©   (31.10.05 00:48) [28]
> Вы додумали свою задачу и пришли к тому что решения нет. Я свою и пришел к решению. Вы правы а я нет. Почему?
потому, что додумал именно ты,  а мы поняли как есть. буквально.
Arazel ©   (29.10.05 21:00) [3]
> Помогите вычислить длину текста в  симолах по Canvas.TextWidth?
не обрезать, не подогнать под размер а вычислить...

что спрошено на то и ответ. и я так и считаю правильный ответ на это
Eraser ©   (29.10.05 21:07) [4]
isasa ©   (29.10.05 22:13) [5]
Юрий Зотов ©   (30.10.05 05:47) [6]
и дальнейшие уточнения не в счет, т.к. ты возражал именно на это
homm ©   (30.10.05 07:05) [7]
>>  задача общего решения не имеет.
> Отнюдь!
а не давал уточнение по возможной интерпретации ответа. или на дальнейшие уточнения. и упреки тебе именно поэтому, опроверг сказаное до этого сказал что это (написаное раньше тебя) имеет решение, а абсолютно не то.
впрочем я повторяюсь в sniknik ©   (30.10.05 22:30) [25] это уже говорил.

> sniknik ©   (30.10.05 11:08) [9]
>> Ты наверное до сих пор думаеш, что я количество точек считал? Наивный...
см.
sniknik ©   (30.10.05 20:25) [22]
> ты не нашол длинну строки из ширины, а обрезал существую строку под заданную ширину (т.е. частность).

не передергивай, и не додумывай за меня, читай.


 
sniknik ©   (2005-10-31 08:17) [30]

> а абсолютно не то.
= а решение дал абсолютно не то.


 
Anatoly Podgoretsky ©   (2005-10-31 09:33) [31]

Не надо ничего придумывать, вот вопрос автора
Помогите вычислить длину текста по Width?
Все остальное телепатия. Просто привыкните к тому, что данный автор практически никогда не может сформулировать вопрос и сделайте выводы. Часто ваши фантазии не имеют ничего общего, с тем что хотел спросить автора.

Тяжелая работа из болота тянуть бегемота.



Страницы: 1 вся ветка

Текущий архив: 2005.11.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.041 c
11-1096632274
Дмитрий Галин
2004-10-01 16:04
2005.11.20
TChart и KOL


14-1130681845
lookin
2005-10-30 17:17
2005.11.20
Как понять такую ошибку?


2-1130622911
Takezhan
2005-10-30 01:55
2005.11.20
Отправка почты формата html


2-1130920589
Ale-x
2005-11-02 11:36
2005.11.20
Автозапуск


2-1131051303
Toxa_ua
2005-11-03 23:55
2005.11.20
~ ?