![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| (С)нежная королёва |
|
|||
|
Unregistered |
После того, как мой компонент много-много раз перерисуется (наверное миллион раз), меняется цвет некоторых линий, а потом и вообще все виснет. Подозреваю, утечку какого-либо графического ресурса, или возможно виновата слишком интенсивная работа с этими самыми ресурсами. В процедуре Paint вначале создаю несколько Pen-ов, Brush-ей, в конце освобождаю их. Кто знаком с темой?
|
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Покажи код отрисовки компонента
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| (С) |
|
|||
|
Unregistered |
Код примерно такой (вычисления я в основном удалил)
procedure TMyComponent.Paint; var ARect: TRect; X, Y, dX, dY, hor_width, i: integer; s: string; DC: HDC; Brush, FocusedBrush, SavedBrush: HBRUSH; SavedPen, LinesPen, ColorPen, PlPen, HorPen: HPEN; Icon: TIcon; SavedFont: HFONT; procedure DrawLine(X1, Y1, X2, Y2: integer); begin MoveToEx(DC, X1, Y1, nil); LineTo (DC, X2, Y2); end; procedure DrawIcon(Icon: TIcon; Left, Top, Width, Height: integer); var icon2: HICON; begin if not Icon.Empty then if FEnabled then DrawIconEx(DC, Left, Top, Icon.Handle, Width, Height, 0, Brush, DI_IMAGE) else begin icon2:= CopyImage(Icon.Handle, IMAGE_ICON, Width, Height, LR_MONOCHROME); DrawIconEx(DC, Left, Top, icon2, Width, Height, 0, Brush, DI_IMAGE); DestroyIcon(icon2); end; end; begin Icon:= TIcon.Create; DC:= Canvas.Handle; LinesPen:= CreatePen(PS_SOLID, 0, FLinesColor); ColorPen:= CreatePen(PS_SOLID, 0, Color); PlPen:= CreatePen(PS_SOLID, 0, FPlusColor); Brush:= CreateSolidBrush(Color); FocusedBrush:= CreateSolidBrush(FFocusColor); if FDrawHor then HorLinesPen:= CreatePen(PS_SOLID, 0, FHorColor); SavedBrush:= SelectObject(DC, Brush ); SavedPen:= SelectObject(DC, LinesPen ); SavedFont:= SelectObject(DC, self.Font.Handle); SetBkColor(DC, Color); while n <> nil do begin if FDrawLines then begin SelectObject(DC, LinesPen); DrawLine(X, dY, X + dX, dY); end; if b then begin SelectObject(DC, PlPen); Rectangle(DC, ng.PlLeft, ng.PlTop, ng.PlLeft + FPlSize, ng.PlTop + FPlSize); DrawLine(ng.PlLeft + FPlSize shr 2, dY, ng.PlLeft + FPlSize - FPlSize shr 2, dY); end; if b then begin if FImages <> nil then begin FImages.GetIcon(n.FImageIndex, Icon); DrawIcon(n, Icon, ng.IconLeft, ng.IconTop, FIconWidth, FIconHeight); end; SetTextColor(DC, n.GetFont.Color); FillRect(DC, Rect(ng.TextLeft, ng.TextTop, ng.TextRight, ng.TextBottom), FocusedBrush); SetBkColor(DC, FFocusColor); SetTextColor(DC, FFocusFontColor); DrawText(DC, PChar(s), -1, ARect, DT_WORDBREAK or DT_NOCLIP); if n = FFocused then SetBkColor(DC, Color); end; Y:= Y + n.FHeight; if Y > Height then break; if FDrawHor then begin SelectObject(DC, HorLinesPen); DrawLine(0, Y - hor_width, Width, Y - hor_width); end; n:= n.Next; end; SelectObject(DC, SavedPen); SelectObject(DC, SavedBrush); if FTop <> nil then SelectObject(DC, SavedFont); DeleteObject(LinesPen); DeleteObject(PlusPen); DeleteObject(ColorPen); DeleteObject(FocusedBrush); if FDrawHor then DeleteObject(HorPen); Icon.Free; end; |
|||
|
||||
| man2002ua |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 943 Регистрация: 12.11.2002 Где: Киев Репутация: нет Всего: 2 |
попробуй вместо DC := Canvas.DC поставить DC := GetDC(YourComponentWindow.Handle), а в конце - ReleaseDC(DC, YourComponentWindow.Handle);
Раз уж ты везде пользуешь функции API... -------------------- "Нет ничего более постоянного, чем временное" |
|||
|
||||
| December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Скорее всего, здесь виноват не код, а сама графическая векторная подсистема винды. У меня не раз было, что после множества операций с векторной графикой кончались системные ресурсы и приходилось перезагружать винды (особенно при работе с DDE). Причём не только с участием моих программ - Word этим очень грешен.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |