Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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 спаренных... (в редакторе они одинаковой длинны, как в отображении счас посмотрим )
&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.042 c
3-1128686858
Скиф
2005-10-07 16:07
2005.11.20
Создание dbf таблицы , создание индексного файла.


14-1130411016
TButton
2005-10-27 15:03
2005.11.20
влияет ли визуальный стиль вндовс ХР на загрузку процессора


10-1107741402
Сергей Александров
2005-02-07 04:56
2005.11.20
COM Server&amp;Client (почти по Тенцеру)


14-1130493355
konda
2005-10-28 13:55
2005.11.20
Очередной "конец света"


2-1130499208
Yus
2005-10-28 15:33
2005.11.20
Работа с классами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский