![]() |
|
|
Регистрация | << Правила форума >> | 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); |