Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
ВнизПроцедура отъедает GDI handle Найти похожие ветки
← →
oleg_ (2005-12-23 22:47) [0]Вот эта проц заполняет верх и низ окна фоновым рисунком с затемнением и осветлением краев закрашивания, но при каждом запуске сабж. Подскажите, что надо высвобождать еще?
Сорри за большой пост...
procedure fill_pattern(obj:tform;TOP,BOTTOM:INTEGER);
var h,w,q,i,j,im,jm:integer;
str,stg,stb,enr,eng,enb:integer;
dr,db,dg:double;
x, y: integer;
bm, bm1{, bm2}: Graphics.TBitMap;
p1, p2, p: PByteArray;
c,cm: integer;
k,km: integer;
oblast:integer;//0-между верхней и нижней границей не рисуем
//1-выше top
//2-граница top
//3-граница bottom
//4-ниже bottom
begin
bm := Graphics.TBitMap.Create;
bm1 := Graphics.TBitMap.Create;
try
bm.PixelFormat := pf24bit;
bm1.PixelFormat := pf24bit;
bm.Assign(form14.Image2.Picture.Bitmap);
bm1.Assign(form14.Image2.Picture.Bitmap);
x:=1;
y:=1;
im:=floor(obj.ClientWidth/bm1.Width);
jm:=floor(obj.ClientHeight/bm1.Height);
randomize;
for i := 0 to im do
for j := 0 to jm do
begin
//определяем область прорисовки , она определит выравнивание по вертикали
if (j+1)*bm1.Height<top then oblast:=1
else if (j*bm1.Height<top)and((j+1)*bm1.Height>top) then oblast:=2
else if (j*bm1.Height<bottom)and((j+1)*bm1.Height>bottom) then oblast:=3
else if (j*bm1.Height>bottom) then oblast:=4
else oblast:=0;//непрорисовываемая область
if oblast=0 then continue;
q:=0;
//формируем случайно уникальный прорисовываемый фрагмент
cm:=bm.Height - 1;
for c := 0 to cm do
begin
w:=0;
if oblast=2 then
w:=max(40-5*(cm-c),0);
if oblast=3 then
w:=-max(40-5*c,0);
h:=random(bm.Height);
if h>bm.Height*0.2 then
h:=c;
p := bm.ScanLine[h];
p1 := bm1.ScanLine[c];
km:=bm.Width * 3 - 1;
for k := 0 to km do
begin
p1^[k] :=min(max(0,p^[k]-w-q),255);//
end;
end;
//прорисовываем с выравниванием в зависимости от области
x:=bm1.Width*i;
y:=bm1.Height*j;
if (oblast=2) then//выравнивание нижнего края по top
y:=top-bm1.Height;
if (oblast=3) then//выравнивание верхнего края по bottom
y:=bottom;
//накладываем ограничения по размеру формы
x:=min(obj.ClientWidth-bm1.Width,x);
y:=min(obj.ClientHeight-bm1.Height,y);
//рисуем
obj.Canvas.Draw(x,y, bm1);
// min(obj.ClientHeight-bm1.Height,y+bm1.Height*j), bm1);
end;
finally
Bm.Dormant; // Free up GDI resources
Bm1.Dormant; // Free up GDI resources
BM.FreeImage; // Free up Memory.
BM1.FreeImage; // Free up Memory.
bm.ReleaseHandle;
bm.Free;
bm1.ReleaseHandle;
bm1.Free;
end;
end;
← →
GuAV © (2005-12-23 23:02) [1]
>Bm.Dormant; // Free up GDI resources
>Bm1.Dormant; // Free up GDI resources
>BM.FreeImage; // Free up Memory.
>BM1.FreeImage; // Free up Memory.
>bm.ReleaseHandle;
>bm.Free;
>bm1.ReleaseHandle;
> bm1.Free;
Достаточно Free, остальное освобождение должно делаться само.
>bm := Graphics.TBitMap.Create;
>bm1 := Graphics.TBitMap.Create;
> try
Следует либо сделать try для каждого объекта, либо, как альтернативный вариант, писать так:
bm := nil;
bm1 := Graphics.TBitMap.Create;
try
bm := Graphics.TBitMap.Create;
← →
oleg_ (2005-12-23 23:10) [2]Ошибок не сыплет, насчет разведения блоков защиты согласен.
Даже при dormat и freeimage при каждом запуске отъедает по 2 gdi handle.
← →
GuAV © (2005-12-23 23:17) [3]
> Даже при dormat и freeimage при каждом запуске
> отъедает по 2 gdi handle.
Так а если убрать Dormant, FreeImage и ReleaseHandle ?
← →
oleg_ (2005-12-23 23:23) [4]Сработало...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c