Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение ширины строки в пикселах для компонента memo [D7, Win2k, WinXP]


SMT ©   (2005-01-03 11:20:00) 

Уважаемые Мастера,

Как правильно определить ширину строки в пикселах для компонента Memo?

Я пытаюсь автоматически подгонять ширину компонента Memo в зависимости от
установленного числа логических пикселей для экрана от 96 до 120
пикселей/дюйм. Для этого надо найти свойство или метод у компонента
Memo, позволяющего провести такой расчет, например,аналог Form.Canvas.TextWidth.
Однако я ничего не нашел.

Без автонастройки текст либо не помещается в габарит Memo, либо справа
остается слишком широкое пустое пространство.

Игорь Степанов


SMT   (2005-01-04 14:48:00) [1]

Уважаемые мастера,

Большое спасибо за помощь. В моем случае ошибка заключалась именно в том, что у формы Form1.Canvas.Font были другие параметры, чем у Memo1.Font. Когда шрифт в Canvas получил в точности параметры шрифта в memo, Form1.Canvas.TextWidth дало правильные значения. Таким образом, проблема закрыта. теперь у меня размеры Memo1  и, соответственно, формы не меняются при установке значения логических пикселей от 96 до 120 pixels/inch.

С уважением и наилучшими пожеланиями,

Игорь Степанов


KSergey   (2005-01-04 10:25:00) [2]

Таки забыл приписать:

var
 MemoRect: TRect;


KSergey   (2005-01-04 10:24:00) [3]

По поводу получения ширины текста на memo

 cnv := TCanvas.Create;
 try
   cnv.Handle := GetDC (memo.Handle);
   cnv.Font.Assign (memo.Font);
   cnv.TextWidth(текст);  // а вот и получили ширину, именно тем шрифтом как и memo


На счет как там будет с "пикселей/дюйм" - не уверен, может еще что-то надо сделать "Assign"?

По поводу получения "запаса" - например, так

   memo.Perform(EM_GETRECT, 0, Integer(@MemoRect));
   // 1. MemoRect.Right - MemoRect.Left - ширина клиентской области memo
   // 2. memo.Width - полная ширина.
   // Разница между 1 и 2 думаю даст как раз подходящую поправку.


Дурдом   (2005-01-03 13:33:00) [4]

Длина строки в пикселах определяется через АПИ GetTextExtentPoint32
Посмотрите, в SDK есть её описание.


Anatoly Podgoretsky   (2005-01-03 12:57:00) [5]

У формы и у мемо может быть разный шрифт


KilkennyCat   (2005-01-03 12:55:00) [6]


> saNat ©   (03.01.05 12:42) [1]

да, когда-то тоже была проблема, тоже применил 6 пикселов.


saNat   (2005-01-03 12:42:00) [7]

Когда я делал выравнивание по ширине у Memo, то для определения длины строки использовал метод канвы формы Form.Canvas.TextWidth. Хотя была проблема, например, при длине текста 99 пикселей и клиентской ширине Мемо 100 пикселей. Текст все равно переносился. Я решил, что это из-за 3D рамки и делал отступ порялка 6 пикселей.

С уважением, ЕВА


Наверх

Титульная страница Поиск, карта сайта Написать письмо