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

Вниз

Текст в таблице с фиксированными размерами ячеек.   Найти похожие ветки 

 
Lony ©   (2004-01-21 14:30) [0]

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


 
YuRock ©   (2004-01-21 14:41) [1]

В API есть ф-ция GetTextExtentPoint32, которая отдает высоту/длину текста в заданном контексте. С помощью нее (и изменения размера шрифта) можно подобрать минимально допустимый размер шрифта.

P.S. У TCanvas есть соответствующие методы - TextWidth и TextHeight


 
Lony ©   (2004-01-21 16:01) [2]

Не могу разобраться с функцией GetTextExtentPoint32.
HDC зачем нужен, т.е. понятно, зачем он нужен, как его использовать?
lpString - это наша строка?
cbString - определяет число символов в строке?
lpSize - размер прямоугольника текста? А какого он типа, TPoint?


 
Тимохов ©   (2004-01-21 16:06) [3]

Почитай второй абзац сообщения YuRock © (21.01.04 14:41) [1]


 
YuRock ©   (2004-01-21 16:13) [4]

Все ответы верны, кроме первого (его нет):

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

Получить его можно с помощью GetDC(hWindow), где hWindow - хендл вашего окна (таблицы).

В крайнем случае можно использовать DC "нулевого" окна. Пример:


var
DC: HDC
begin
DC := GetDC(0);
... // Здесь можно как-то использовать DC
ReleaseDC(0, DC);
end;


 
Тимохов ©   (2004-01-21 16:20) [5]

YuRock © (21.01.04 16:13) [4]
Вопрос Вам.
ReleaseDc обязательно делать?


 
YuRock ©   (2004-01-21 16:25) [6]

> Тимохов © (21.01.04 16:20) [5]

Ну, как вам сказать...

Если в 95/98/ME можно и сделать, и потом может поработань некоторое время программа,

а вот в NT/2k/XP/03 надо обязательно - иначе в лучшем случае чудеса начнутся


 
Тимохов ©   (2004-01-21 16:28) [7]

YuRock © (21.01.04 16:25) [6]
В свое время мне лень было читать MSDN по этому вопросу, так что стал пользоваться TControlCanvas.
Спавибо за ответ - буду знать.


 
Lony ©   (2004-01-21 16:30) [8]

А для структуры SIZE надо создавать новый тип?
Т.е.

type
NewType = record
w: Integer;
h: Integer;
end;



var
d: NewType;
a: PChar;
c: Integer;
begin
GetTextExtentPoint32(GetDC(Edit1.Handle),a,c,d);
end.


Просто ошибку пишет "types of actual and formal var parameters must be identical".


 
Тимохов ©   (2004-01-21 16:32) [9]

Открой модуль graphics
По строке поиска "GetTextExtentPoint32" найди интересующие тебя места - все вопросы сами отпадут.


 
Lony ©   (2004-01-21 16:36) [10]

А, всё, понял. TSize! Спасибо за помощь!


 
Тимохов ©   (2004-01-21 16:37) [11]

И вообще как ты при такой GetTextExtentPoint32(GetDC(Edit1.Handle),a,c,d) записи собараешься вызывать ReleaseDc?


 
YuRock ©   (2004-01-21 16:42) [12]

> А для структуры SIZE надо создавать новый тип?

Не обязательно. Есть TSize.

> пример кода

1. Что такое a? Кто память будет выделять под нее?
2. Чему равно с? Оно должно быть равно длине строки a!
3. Как Вы собираетесь делать ReleaseDC?..

В общем, вот рабочий вариант (пример):


var
DC: HDC;
sz: TSize;

begin
DC := GetDC(Edit1.Handle);

GetTextExtentPoint32(DC, PChar(Edit1.Text), Length(Edit1.Text), sz);
ShowMessage(IntToStr(sz.cx) + " : " + IntToStr(sz.cy));

ReleaseDC(Edit1.Handle, DC);
end.


или (намного проще, но делает то же самое (только дольше)):

begin
ShowMessage(Edit1.Canvas.TextWidth(Edit1.Text) + " : " + Edit1.Canvas.TextHeight(Edit1.Text));
end.


 
Lony ©   (2004-01-21 16:46) [13]

Огромное спасибо. Теперь всё понял.


 
Lony ©   (2004-01-21 17:27) [14]

Что я опять неправильно делаю? При любом размере шрифта в TEdit выдаются одни и те же значение длины. Почему?


 
YuRock ©   (2004-01-21 17:43) [15]

А как Вы делаете? Если в точности, как в [12], то так и должно быть, ведь текущий шрифт - совсем не тот, который у текста эдита.

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

var
DC: HDC;
sz: TSize;
OldFont: HFONT;

begin
DC := GetDC(Edit1.Handle);

OldFont := SelectObject(DC, Edit1.Font.Handle);
GetTextExtentPoint32(DC, PChar(Edit1.Text), Length(Edit1.Text), sz);
SelectObject(DC, OldFont);

ReleaseDC(Edit1.Handle, DC);

ShowMessage(IntToStr(sz.cx) + " : " + IntToStr(sz.cy));
end.



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

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

Наверх




Память: 0.5 MB
Время: 0.018 c
4-2417
Леприкон
2003-11-25 15:33
2004.02.02
Работа с меню


3-1988
Алексеюшка
2004-01-08 13:19
2004.02.02
Не сохраняются изменения на сервере


6-2243
scr
2003-11-26 15:37
2004.02.02
TidSMTP (INDY) и прокси!


4-2414
tim
2003-11-25 13:43
2004.02.02
поймать сообщение в сервисе


1-2190
Zheks
2004-01-21 10:19
2004.02.02
Знаки после запятой