Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Процедура отъедает 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.042 c
2-1137320121
SergP
2006-01-15 13:15
2006.01.29
StrToDateTime. Проблема с форматом даты/времени


1-1135367246
oleg_
2005-12-23 22:47
2006.01.29
Процедура отъедает GDI handle


15-1136552111
Cerberus
2006-01-06 15:55
2006.01.29
Сколько вы готовы платить за хостинг?


15-1136886264
syte_ser78
2006-01-10 12:44
2006.01.29
распайка СОМа


2-1136931894
Arazel
2006-01-11 01:24
2006.01.29
Опредиление Тип устройста хранение информаций