![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 у меня вопрос по  CreateDIBSection. 
		
	
		
		
		
		
		
	
		
		
	
	
	есть фрагмент функции: ..... DC := GetDC(0); hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0); ...... при однократном вызове функции за период работы программы все нормально. но если вызвывать фунцкию многократно именно в этом метсе выдает ошибку. Проблема в том функция дает как резальтат указатель на обект, который дальше будет использоватся. Я так понимаю что при многократном вызове функции занимается все больше и больше место в памяти и происходит переполнение. Вопрос: как сделать что-бы освобождать область, на которую указывает указатель( извините за тафтологию). CreateDIBSection - функция Windows если нужно дам полный исходник функции  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Обязательно надо освобождать память. Делается это при помощи 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	function DeleteObject(hNewBitmap);  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 проблема то в том что эта функция используется 
		
	
		
		
		
		
		
	
		
		
	
	
	вот полный исходник кода функции: function PNGtoIcon( str : string; ACursor : Boolean = false; AHotSpotX : Integer = 0; AHotSpotY : Integer = 0) : HICON; var APNG : TPNGObject; Width, Height : Integer; BitmapHeader : PBitmapV5Header; hNewBitmap, hMonoBitmap : HBITMAP; Bits : Pointer; x, y : Integer; DC : HDC; IconInfo : _ICONINFO; Pixel : ^Integer; ScanLine : PRGBTriple; AlphaScanline : pByteArray; begin APNG := TPNGObject.Create; APNG.LoadFromFile(str); Width := APNG.Width; Height := APNG.Height; New(BitmapHeader); BitmapHeader.bV5Size := sizeof(BITMAPV5HEADER); BitmapHeader.bV5Width := Width; BitmapHeader.bV5Height := -Height; BitmapHeader.bV5Planes := 1; BitmapHeader.bV5BitCount := 32; BitmapHeader.bV5Compression := BI_BITFIELDS; BitmapHeader.bV5RedMask := $00FF0000; BitmapHeader.bV5GreenMask := $0000FF00; BitmapHeader.bV5BlueMask := $000000FF; BitmapHeader.bV5AlphaMask := $FF000000; DC := GetDC(0); hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0); Dispose(BitmapHeader); ReleaseDC(0,dc); hMonoBitmap:=CreateBitmap(Width,Height,1,1,nil); Pixel := Bits; for y := 0 to Height-1 do begin ScanLine := APNG.Scanline[y]; AlphaScanline := APNG.AlphaScanline[y]; for x := 0 to Width - 1 do begin Pixel^ := AlphaScanLine[x]; Pixel^ := Pixel^ shl 8; Inc(Pixel^, Scanline^.rgbtRed); Pixel^ := Pixel^ shl 8; Inc(Pixel^, Scanline^.rgbtGreen); Pixel^ := Pixel^ shl 8; Inc(Pixel^, Scanline^.rgbtBlue); Inc(Pixel); Inc(ScanLine); end; end; IconInfo.fIcon := not ACursor; if ACursor then begin IconInfo.xHotspot := AHotSpotX; IconInfo.yHotspot := AHotSpotY; end; IconInfo.hbmMask := hMonoBitmap; IconInfo.hbmColor := hNewBitmap; Result := CreateIconIndirect(IconInfo); DeleteObject(hNewBitmap); DeleteObject(hMonoBitmap); APNG.Free; end; Текст ошибки: Floating point divizion by zero, выдает ошибку вот на таком такой строчке hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0);  |