Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизВывод текста в заданном прямоугольнике Найти похожие ветки
← →
pudel (2005-06-01 11:23) [0]Всем привет! Собственно вопрос в теме. Как это сделать?
← →
pasha_golub © (2005-06-01 11:28) [1]DrawText + F1
← →
Digitman © (2005-06-01 11:28) [2])
Label.Caption := "Текст";
← →
pasha_golub © (2005-06-01 11:30) [3]Digitman © (01.06.05 11:28) [2]
Мощно. :0)
← →
Digitman © (2005-06-01 11:33) [4]
> pasha_golub © (01.06.05 11:30) [3]
> Мощно. :0)
а чего выёживаться зазря ?)
прямоугольник он и в африке прямоугольник)
чем TLabel хуже прямоугольника ?) ...самое то !)
← →
pudel (2005-06-01 11:39) [5]Для юмористов уточню: размер шрифта должен подбираться автоматически.
← →
Думкин © (2005-06-01 11:41) [6]> [5] pudel (01.06.05 11:39)
Почитай: http://www.delphimaster.ru/articles/stringgrid/index.html
← →
Mx © (2005-06-01 11:41) [7]см. [1] и используй там константу DT_CALCRECT
← →
pasha_golub © (2005-06-01 11:53) [8]pudel (01.06.05 11:39) [5]
А кофе он должен уметь варить? ;0)
← →
pudel (2005-06-01 11:56) [9]Прочитал статью.
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_WORDBREAK); - работает
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT); - полная тишина. Я что-то пропустил в статье?
← →
Думкин © (2005-06-01 12:00) [10]> [9] pudel (01.06.05 11:56)
Да ничего - просто все и своидится к
"При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справке обратить внимание на константу DT_CALCRECT."
Что и говорилось тут неоднократно. Флаги можно выставлять не только по одному.
← →
pasha_golub © (2005-06-01 12:03) [11]pudel (01.06.05 11:56) [9]
Угу, пропустил.
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT);
Расчитывает и устанавливает необходимые(!) размеры прямоугольника при заданных характеристиках шрифта. И вызывать в твоем случае нужно вот так:
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT OR DT_WORDBREAK);
Ну и собсно, цитата из хелпа:
DT_CALCRECT Determines the width and height of the rectangle. If there are multiple lines of text, DrawText uses the width of the rectangle pointed to by the lpRect parameter and extends the base of the rectangle to bound the last line of text. If there is only one line of text, DrawText modifies the right side of the rectangle so that it bounds the last character in the line. In either case, DrawText returns the height of the formatted text but does not draw the text.
← →
pudel (2005-06-01 12:11) [12]DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect, DT_CALCRECT OR DT_WORDBREAK); - не работает.
← →
Думкин © (2005-06-01 12:13) [13]> [12] pudel (01.06.05 12:11)
? Чтио именно не работает. Код давай.
← →
pasha_golub © (2005-06-01 12:15) [14]pudel (01.06.05 12:11) [12]
При вызове с параметром DT_CALCRECT оно не будет рисовать! В справке ж английским по белому написано.
← →
pudel (2005-06-01 12:17) [15]procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string;
begin
s := "Hello world! Hello world! Hello world! Hello world!";
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect,DT_WORDBREAK);
end;
Смотри: http://www.delphimaster.ru/articles/stringgrid/index.html
Уточню ещё раз: мне нужно вписать текств заданныйпрямоугольник. Т. е. подобрать характеристики шпифта.
← →
pudel (2005-06-01 12:19) [16]Сорри ...
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var s:string;
begin
s := "Hello world! Hello world! Hello world! Hello world!";
DrawText(StringGrid1.Canvas.Handle,PChar(s),length(s),Rect,DT_CALCRECT OR DT_WORDBREAK);
end;
← →
Юрий Зотов © (2005-06-01 12:19) [17]> pasha_golub © (01.06.05 12:15) [14]
Это ж надо открыть справку... потом читать... потом переводить... мороки-то сколько...
Ты, Паш, не умничай, ты код давай!
← →
Юрий Зотов © (2005-06-01 12:30) [18]> pudel (01.06.05 12:19) [16]
Скажите, сколько времени нужно, чтобы додуматься, например, вот до такого алгоритма:
1. Вызываем DrawText с DT_CALCRECT OR DT_WORDBREAK - получаем минимальную высоту прямоугольника, в котором может уместиться текст.
2. Если эта высота не больше высоты ячейки - goto 5.
3. Уменьшаем размер шрифта на единицу. Если получился ноль - значит, текст слишком длиный и не может быть вписан в ячейку никаким шрифтом. Goto 6.
4. Goto 1.
5. Рисуем текст (вызываем DrawText уже без DT_CALCRECT).
6. Выход.
================================
Так сколько же нужно времени, чтобы додуматься до такого простенького алгоритма?
← →
Digitman © (2005-06-01 12:34) [19]
> pudel (01.06.05 11:39) [5]
а GetTextExtentPoint не спасет отца русской демократии ?
разбиваешь свою строку на подстроки (сам делаешь wrap)
для каждой подстроки, перебирая и устанавливая по убыванию размеры тек.фонта, получаешь ширину и высоту, "суммируешь" полученные rect"ы, сравниваешь "сумму" с заданным rect"ом, при первом же непревышении - брейк)
← →
Mx © (2005-06-01 12:40) [20]Кстати, не какая-то из этих функций неверно расчитывает прямоугольник для наклонного шрифта. Когда писал компонент а-ля Excel.Worksheet приходилось добавлять угол.
← →
Mx © (2005-06-01 12:41) [21]Oops, "не" после запятой НЕ читать
← →
Digitman © (2005-06-01 12:42) [22]
> Юрий Зотов © (01.06.05 12:30) [18]
автор самому себе противоречит.
у него есть заданный фонт с заданным размером, есть заданный рект (т.е. менять ни фонт, ни его размер, ни рект якобы нельзя по условиям, иначе в условия было бы отражено обратное), и он пытается что-то куда-то "вписать" при этих условиях !
это типа у меня есть гаечный ключ на 24 и есть кольцо 20 мм в диаметре, как бы мне просунуть ключ в кольцо ? есть и другие ключи, есть и другие кольца, но мне нужно именно ЭТОТ ключ в ЭТО кольцо просунуть)
и после этого мы тут юмористами оказываемся)
← →
pudel (2005-06-01 12:45) [23]Чтобы найти квадратный корень из 4 можно сделать 1+1 потом 2+2. Но увы, хочется, как-то попроще и побыстрее. А то у отца русской демократии очень много прямоугольников и они очень часто меняют размеры. Боюсь перебор не потянет.
← →
pudel (2005-06-01 12:48) [24]Ещё раз уточняю. Фонт не задан(об этом речи не было). Задан Рект.
← →
Mx © (2005-06-01 12:49) [25]
> Digitman © (01.06.05 12:42) [22]
> это типа у меня есть гаечный ключ на 24 и есть кольцо 20
> мм в диаметре, как бы мне просунуть ключ в кольцо ? есть
> и другие ключи, есть и другие кольца, но мне нужно именно
> ЭТОТ ключ в ЭТО кольцо просунуть)
Как показала соседняя ветка примерно так организован BMM :)
← →
Думкин © (2005-06-01 12:52) [26]> [24] pudel (01.06.05 12:48)
А ты не бойся - ты попробуй. Чай не набаках расчеты ведуться. Вот у меня все тянуло, а у тебя не потянет. Странно.
← →
Думкин © (2005-06-01 12:52) [27]на абаках
← →
Mx © (2005-06-01 12:53) [28]
> pudel (01.06.05 12:48) [24]
> Фонт не задан(об этом речи не было).
Блин не фига себе. Тады можно перебрать несколько размеров шрифтов и посмотреть вписывается прямоугольник или нет.
Щас посмотрел, наклонный шрифт DrawText неверно расчитывает. Да и TextExtent вроде тоже.
← →
Думкин © (2005-06-01 12:53) [29]ведутся
совсем устал. :(
← →
Digitman © (2005-06-01 12:54) [30]
> pudel (01.06.05 12:48) [24]
тогда ты чужой огород ринулся вскапывать, с DrawText(DT_CALCRECT)..
ты же вновь сам себе противоречишь !
по условию рект задан на перед, но при этом тебя устраивает(цитата из справки)
"..extends the base of the rectangle to bound the last line of text"
> Фонт не задан
придется задать !
и вычислить, какой из них и с какими атрибутами подойдет, можно только перебором
← →
pudel (2005-06-01 13:02) [31]Фраза "При всей рабочести кода, умные люди за него не похвалят. По хорошему, надо было бы сперва расчитать высоту текста, а уж потом выводить. Но это я оставляю на домашнее задание читателю. Подскажу лишь, что нужно в справке обратить внимание на константу DT_CALCRECT." смутила. Понятия не имею, зачем посоветовали DrawText(DT_CALCRECT).
Неужели нельзя расчитать размер Фонта в пикселях, а не в каких-то Сайзах.
← →
nikkie © (2005-06-01 13:05) [32]пеши исчо.
извините, не удержался.
← →
Digitman © (2005-06-01 13:11) [33]
> Понятия не имею, зачем посоветовали DrawText(DT_CALCRECT).
а я понятия не имею, почему ты порочитав статью не сравнил то о чем в ней идет речь с тем что требуется именно тебе ..
> Неужели нельзя расчитать размер Фонта в пикселях, а не в
> каких-то Сайзах
размер фонта не задается ни в пикселях ни к каких-то там непонятным "сайзах", задается он в "пойнтах"
при этом (цитата)
To determine the size of the font in pixels, use the Height property instead. The value of Size can be obtained from the height in pixels using this formula:
Font.Size = -Font.Height * 72 / Font.PixelsPerInch
и есть готовый метод, кстати
TCanvas.TextExtent
← →
Digitman © (2005-06-01 13:15) [34]т.е. размер фонта в пойнтах м.б. расчитан на основании высоты в пикселах и коэф-та конверсии (пиксел на дюйм)
← →
pudel (2005-06-01 13:31) [35]TCanvas.TextExtent как и другии это рассчёты перебором. Г-н Думкин уже давно устал так считать. Для
Label1.Caption := "Label1" Label1.Width := 32 Label1.Height := 13
Label1.Font.Size := 8. Ну И ?
← →
Думкин © (2005-06-01 13:33) [36]> [35] pudel (01.06.05 13:31)
Я устал так считать? На абаке? О чем речь?
← →
pudel (2005-06-01 13:37) [37]Да да. Про абак.
← →
Думкин © (2005-06-01 13:38) [38]> [37] pudel (01.06.05 13:37)
Ты попробовал? Тормозит? Попробуй все-таки.
А устал я - потому что сплю мало. :))
← →
pudel (2005-06-01 13:42) [39]7 лет назад пробовал. Не хочу наступать на тежи грабли. Тогда же пытался понть, что можно сделать с Font.Size = -Font.Height * 72 / Font.PixelsPerInch.
← →
Digitman © (2005-06-01 13:43) [40]
> pudel (01.06.05 13:31) [35]
> Ну И ?
что "ну И" ?
при чем здесь Label.Width/Height ?
речь идет о TFont.Height
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.04 c