Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.018 c
6-2249
Alek_1
2003-11-29 02:55
2004.02.02
Ошибка в сокетах


1-2164
vivo
2004-01-21 14:15
2004.02.02
Как узнать, что загружено в Image.Picture?


1-2066
Nab_OFF
2004-01-20 13:07
2004.02.02
StatusBar


1-2119
alsov
2004-01-19 15:51
2004.02.02
Adobe Photoshop SDK


3-1998
SerKom
2004-01-08 05:39
2004.02.02
Как считать





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский