Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 этим очень грешен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)