Форум: "Начинающим";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];
ВнизПреобразование 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 спаренных... (в редакторе они одинаковой длинны, как в отображении счас посмотрим )
̣"˙̣˙̣˙̣˙̣˙̣˙̣˙̣˙̣˙̣˙ ;̣˙̣˙̣˙̣˙̣˙̣˙̣˙̣˙"
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.042 c