Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#16: 2008-01-09 13:34:21 ЛС | профиль | цитата
Что вы за народ такой...

Причем тут вообще извинения какие-то.
Если нет уверенности, что все понято правильно, значит есть вероятность что и у нас есть бага.
Это есть прямое следствие ответа намеком, вместо точного.

Допрос с пристрастием сводит эту вероятность к значительно более малой величине (нуля не бывает).
Свел - это есть РЕЗУЛЬТАТ
Потому-что ты ответил большими буквами, потому-что Dilma распояснил, что мвсль его была про системные косяки в условиях дефицита ресурсов.

А то, что из-за такого допроса, иногда, некоторые кипятком писать начинают - так мне не особо и жалко.
Это есть НИЧТО, по сравнении с РЕЗУЛЬТАТОМ

И причем тут какие-то "извинился", "дипломатично", и т.п. - не пойму...
карма: 9

0
Разработчик
Ответов: 26209
Рейтинг: 2137
#17: 2008-01-09 14:05:24 ЛС | профиль | цитата
Galkov писал(а):
значит есть вероятность что и у нас есть бага
Возможно и есть, вот только где, если повторить не получается?

------------ Дoбавленo:


Что-то я вот эти телодвижения со шрифтом не очень понял



#pas
procedure THIImg_Text.Handle;
var
dc:HDC;
Wnd:HWND;
hf:HFONT;
x,y:integer;
s:string;
fnt:TLogFont;
dt:TData;
begin
dt := _Data;
Wnd := ReadInteger(_Data,_data_Bitmap,0);
s := ReadString(_Data,_data_Text,_prop_Text);
x := ReadInteger(_Data,_data_X,_prop_X);
y := ReadInteger(_Data,_data_Y,_prop_Y);
dc := GetDC(wnd);
SetBkMode(DC,TRANSPARENT);
SetTextColor(DC,_prop_Font.Color);
ZeroMemory(@fnt,sizeof(fnt));
fnt.lfHeight := _hi_SizeFnt(_prop_Font.Size);
fnt.lfWidth := fnt.lfHeight div 2 + 1;
fnt.lfCharset := _prop_Font.Charset;
{$ifdef F_P}
{$else}
if fsUnderline in TFontStyle(pointer(@_prop_Font.Style)^) then
fnt.lfUnderline := 1;
if fsItalic in TFontStyle(pointer(@_prop_Font.Style)^) then
fnt.lfItalic := 1;
if fsStrikeOut in TFontStyle(pointer(@_prop_Font.Style)^) then
fnt.lfStrikeOut := 1;
if fsBold in TFontStyle(pointer(@_prop_Font.Style)^) then
fnt.lfWeight := FW_BOLD;
{$endif}

StrPCopy(fnt.lfFaceName,_prop_Font.Name);
hf := CreateFontIndirect(fnt);
SelectObject(DC,hf);
TextOut(DC,x,y,PChar(s),length(s));
DeleteObject(hf);
ReleaseDC(Wnd,DC);
//_hi_OnEvent(_event_onDraw);
_hi_CreateEvent(_Data,@_event_onDraw,dt);
end;
А что проще никак нельзя?
------------ Дoбавленo:

И еще непонятно, зачем работать напрямую с переменной свойств _prop_Font, не в этом ли косяк?
карма: 22

0
Ответов: 2125
Рейтинг: 159
#18: 2008-01-09 14:12:50 ЛС | профиль | цитата
Не люблю программы, которые грузят проц на 100%. И виндовоз их не любит тоже
Есть предположение, что фонт удаляется системой не сразу (тем более что в этом компоненте DC не создаётся/удаляется, а только используется, а фонт, хоть и уничтожается, но остаётся выбранным в том DC), а в условиях ограниченного процессорного времени это не успевает делаться. В итоге создание фонта вообще не происходит, т.к. нету свободных Handle.

Обычно делают так:

hOldFont := SelectObject(hDC, hMyFont);
...
SelectObject(hDC, hOldFont);
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#19: 2008-01-09 14:23:51 ЛС | профиль | цитата
конечно же правильнее было бы один раз создать фонт и использовать его в дальнейшем, что сократит приведенный кусок более чем в два раза.
карма: 27
0
Ответов: 9906
Рейтинг: 351
#20: 2008-01-09 14:33:42 ЛС | профиль | цитата
nesco писал(а):
вот только где, если повторить не получается?

Ну вот видишь, сколько тебе написали
карма: 9

0
Ответов: 5446
Рейтинг: 323
#21: 2008-01-09 16:32:44 ЛС | профиль | цитата
tsdima писал(а):

фонт, хоть и уничтожается, но остаётся выбранным в том DC

А дядя Билли предупреждал: попользовался - сначала убери из DC, выбрав старый GDIObject (ты ведь его сохранил?), а потом уж и удаляй. Иначе - жди беды.
карма: 1

0
Разработчик
Ответов: 26209
Рейтинг: 2137
#22: 2008-01-09 17:46:46 ЛС | профиль | цитата
Ну и куда его воткнуть? Вот переделанный метод из Img_Text



#pas
procedure THIImg_Text.Handle;
var dc:HDC;
Wnd:HWND;
x,y:integer;
s:string;
dt:TData;
begin
dt := _Data;
Wnd := ReadInteger(_Data,_data_Bitmap,0);
dc := GetDC(wnd);
s := ReadString(_Data,_data_Text,_prop_Text);
x := ReadInteger(_Data,_data_X,_prop_X);
y := ReadInteger(_Data,_data_Y,_prop_Y);
SetBkMode(DC,TRANSPARENT);
SetTextColor(DC,Color2RGB(GFont.Color));
SelectObject(DC, hMyFont);
TextOut(DC,x,y,PChar(s),length(s));
ReleaseDC(Wnd,DC);
_hi_CreateEvent(_Data,@_event_onDraw,dt);
end;
Я прогонял исправления. До исправлений жрало кучу основной памяти, после -- стабилизировалось.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#23: 2008-01-09 17:52:41 ЛС | профиль | цитата
Это все идеология "отложенного конструирования"...

Начнешь сразу создавать в конструкторе - пристегнешь весь зверинец, независимо от использования методов, только которым это конструирование и нужно.
Отложишь - либо забудешь уничтожить, либо пойдут разборки про "был ли мальчик". И уж точно потеряешь в эффективности

------------ Дoбавленo:

nesco писал(а):
Ну и куда его воткнуть?

Тебе tsdima не показал разве
карма: 9

0
Разработчик
Ответов: 26209
Рейтинг: 2137
#24: 2008-01-09 17:54:57 ЛС | профиль | цитата
Galkov, если ты мне объяснишь, что он подразумевал под "..." ?
карма: 22

0
Ответов: 2125
Рейтинг: 159
#25: 2008-01-09 17:56:58 ЛС | профиль | цитата
nesco, тогда уж лучше так:

code_8096.txt
карма: 1

0
файлы: 1code_8096.txt [646B] [341]
Разработчик
Ответов: 26209
Рейтинг: 2137
#26: 2008-01-09 18:03:35 ЛС | профиль | цитата
tsdima, в таком фонт не рушится, но где DeleteObject(hOldFont)
------------ Дoбавленo:

Пришлось hOldFont сделать глобальной и очищать в Destructor'e.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#27: 2008-01-09 18:09:04 ЛС | профиль | цитата
nesco писал(а):
где DeleteObject(hOldFont)

НЕ НАДО ТАК ДЕЛАТЬ! Это вообще не твой фонт - оставь его в покое. Его удалит тот, кто его создал.
карма: 1

0
Разработчик
Ответов: 26209
Рейтинг: 2137
#28: 2008-01-09 18:12:37 ЛС | профиль | цитата
tsdima, значит его ни в коем случае трогать нельзя, а в destructore, что, тоже нельзя удалять?
карма: 22

0
Ответов: 2125
Рейтинг: 159
#29: 2008-01-09 18:27:50 ЛС | профиль | цитата
Конечно! Этот фонт, к примеру, мог создать конструктор того объекта, чей HWND ты используешь, и он никак не ожидает, что его фонт кто-то уничтожит. Хорошо, если тот объект всегда делает SelectObject перед TextOut, но он имеет право сделать SelectObject лишь один раз при создании окна (класс которого имеет CS_OWNDC), и уж точно не будет ожидать, что в контексте выбран уничтоженный фонт.
карма: 1

0
Ответов: 5227
Рейтинг: 587
#30: 2008-01-09 19:15:37 ЛС | профиль | цитата
отказался я пока от Handle сделал на Bitmap, всё устраивает в полне

Выглядит примерно так

code_2068.txt
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
файлы: 1code_2068.txt [2.9KB] [493]
Сообщение
...
Прикрепленные файлы
(файлы не залиты)