Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

[VCL] - [TMemo] - если глюк, то чей?

Hello comp,

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

1. берем Delphi 6 или C++Builder 6
2. File-New-Application
3. размещаем TMemo на форме Form1
4. свойство Memo1.Font.Size устанавливаем побольше, напр. 28

5. Внимание! для Memo1 по умолчанию стоит шрифт MS Sans Serif
текст начинается строго с левой границы TMemo

|Memo1 | //шрифт MS Sans Serif

6. устанавливаем для Memo1 шрифт Roman -
текст начинается строго с левой границы TMemo

|Memo1 | //шрифт Roman

7. устанавливаем для Memo1 шрифт Times New Roman -
текст начинается НЕ строго с левой границы!!!
имеется в наличии некоторое поле

| Memo1 | //шрифт Times New Roman

8. устанавливаем для Memo1 шрифт Roman -
в отличие от пункта 6. теперь
текст начинается НЕ строго с левой границы!!!

| Memo1 | //шрифт Roman

9. устанавливаем для Memo1 шрифт Courier New
текст начинается строго с левой границы TMemo

|Memo1 | //шрифт Courier New

10.устанавливаем для Memo1 шрифт Roman -
текст начинается строго с левой границы TMemo

|Memo1 | //шрифт Roman

итак сравниваем пункты 6, 8 и 10.
если поле для Times New Roman - это не баг, а фича,
то поведение поля для Roman - совсем непонятно


ИМХО глюк VCL, если нет - разубедите, плиз.
И, конечно, посоветуйте как решить эту проблему
во время работы программы
при изменении шрифта компонента.

ЗЫ я частично эту проблему решил, но хочу поучиться более элегантным
решениям

Ответить   Ivan Tue, 2 Mar 2004 17:40:15 +0300 (#95022)

 

Ответы:

Hello Ivan,

Tuesday, March 2, 2004, 5:40:15 PM, you wrote:

ну что молчите.... есть глюк или нет?
:)

Ответить   Ivan Thu, 4 Mar 2004 07:21:33 +0300 (#96204)

 

Попробовал (в дизайнере), Delphi 5. Win2000 Server - глюк проявился. Win98 -
глюк не проявился.
Предположу, что есть некоторое свойство шрифта, определяющее отступ, и VCL
его не сбрасывает при смене (в общем, посмотри исходники VCL и WinAPI по
шрифтам и Edit; думаю, достаточно послать какой-нить event директом в TMemo,
задающий свойства шрифта). Также предположу, что свойство шрифта появилось с
Win2000 (другой вариант - в Win98 другие шрифты..). P.S. Подробнее
исследовать неинтересно, сорри...
Номер выпуска : 2440
Возраст листа : 164 (дней)
Количество подписчиков : 381
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/96440
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "VladS" Thu, 4 Mar 2004 15:06:39 +0300 (#96440)

 

Hello VladS,

Thursday, March 4, 2004, 3:06:39 PM, you wrote:

такого свойства шрифта как отступ ИМХО нет. По крайней мере вывод тем
же шрифтом через DrawText производится безо всякого отступа.
Так что скорее всего это не свойство шрифта, а действительно ЧТО_ТО в
реализации TMemo

А исходники VCL я смотрел, но докопаться до того места, где
производится собственно вывод текста я не смог
потому как там TMemo, далее TCustomMemo, и дальше еще какая-то муть

с

ну вот, собственно, как я решал эту задачу
при установке RECT отступ исчезает в принудительном порядке

RECT rc;
rc.left = 0;
rc.top = 0;
rc.right = Memo->Width;
rc.bottom = Memo->Height;
SendMessage(Memo->Handle, EM_SETRECT, 0, (LPARAM)&rc);

кое-когда, правда, это не проходит.
Кажется в тех случаях, когда высота текста больше высоты Memo

Ответить   Ivan Fri, 5 Mar 2004 07:33:57 +0300 (#97138)

 

Кстати, это же легко проверить - если нарисовать Memo (точнее это
стандартный виндовый компонент 'EDIT' со стилем ES_MULTILINE) с помощью
WinAPI

В общем, попробовал:
edit_handle := CreateWindowEx(WS_EX_CLIENTEDGE, 'EDIT', PChar('Edit1'),
WS_CHILD or WS_TABSTOP or WS_VISIBLE or ES_AUTOHSCROLL or ES_AUTOVSCROLL
or
ES_MULTILINE or ES_WANTRETURN,
12, 40, 208, 154, form_handle, 102, HInstance, nil);
Отступ так же появляется (даже после вызовов задания шрифтов подряд, до
отображения формы):
dc := GetDC(0);
try
pixels := GetDeviceCaps(dc, LOGPIXELSY);
finally
ReleaseDC(0, dc);
end;
font_handle := CreateFont(-MulDiv(28, pixels, 72), 0, 0, 0, FW_NORMAL,
0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, 'Times New Roman');
SendMessage(edit_handle, WM_SETFONT, font_handle, Ord(True));
SendMessage(edit_handle, EM_SETMARGINS, 0, 0);
font_handle := CreateFont(-MulDiv(28, pixels, 72), 0, 0, 0, FW_NORMAL,
0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, 'Roman');
SendMessage(edit_handle, WM_SETFONT, font_handle, Ord(True));

Полагаю, 'EDIT' вычисляет отступ на основе параметров шрифта, и в Times New
Roman эти параметры заданы, а в Roman не заданы (0, "по умолчанию")
[Roman вообще какой-то древний фонт, по-моему, только для совместимости
оставленный]. Поэтому "умный" 'EDIT' и оставляет предыдущий отступ. А
параметров у шрифтов до фига, только их нельзя менять (см., напр., функции
GetTextMetrics, GetOutlineTextMetrics)

Значит, отступ можно поменять только на уровне 'EDIT'а (или сбросить 'EDIT'
как-то)...

В общем, нашел - даже для 'Times New Roman' делает нулевой отступ:
SendMessage(edit_handle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, 0);
Задание отступа (EM_SETMARGINS) поддерживается с Win95/NT 4...

Удачи
--
Номер выпуска : 2459
Возраст листа : 166 (дней)
Количество подписчиков : 381
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/97344
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "VladS" Sat, 6 Mar 2004 00:22:42 +0300 (#97344)