| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Утечка ресурса |
| Автор: (С)нежная королёва 17.10.2003, 09:07 |
| После того, как мой компонент много-много раз перерисуется (наверное миллион раз), меняется цвет некоторых линий, а потом и вообще все виснет. Подозреваю, утечку какого-либо графического ресурса, или возможно виновата слишком интенсивная работа с этими самыми ресурсами. В процедуре Paint вначале создаю несколько Pen-ов, Brush-ей, в конце освобождаю их. Кто знаком с темой? |
| Автор: <Spawn> 17.10.2003, 10:03 |
| Покажи код отрисовки компонента |
| Автор: (С) 17.10.2003, 11:06 |
| Код примерно такой (вычисления я в основном удалил) 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 17.10.2003, 13:55 |
| попробуй вместо DC := Canvas.DC поставить DC := GetDC(YourComponentWindow.Handle), а в конце - ReleaseDC(DC, YourComponentWindow.Handle); Раз уж ты везде пользуешь функции API... |
| Автор: December 17.10.2003, 20:08 |
| Скорее всего, здесь виноват не код, а сама графическая векторная подсистема винды. У меня не раз было, что после множества операций с векторной графикой кончались системные ресурсы и приходилось перезагружать винды (особенно при работе с DDE). Причём не только с участием моих программ - Word этим очень грешен. |