|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Не могу понять где утечка
Есть форма, на ней кнопка, клик по ней вызывает другую форму, она полупрозрачная, на ней выделяю область экрана и делаю скриншот этой области.. в ходе работы программы всё нормально... При закрытии программы выдает уведомление:
вот код той формы, в которой создается tbitmap и делается скриншот. Код:
private isDown: Boolean; downX, downY: Integer; { Private declarations } public Bild: TBitMap; { Public declarations } end; var FORM_SCREEN: TFORM_SCREEN; implementation {$R *.dfm} uses Unit1; function CaptureScreenRect(aRect: TRect): TBitMap; var ScreenDC: HDC; begin Result := TBitMap.Create; Result.Width := aRect.Right - aRect.Left; Result.Height := aRect.Bottom - aRect.Top; ScreenDC := GetDC(0); try BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, ScreenDC, aRect.Left, aRect.Top, SRCCOPY); finally ReleaseDC(0, ScreenDC); end; end; function GetRectByCoord(x1, y1, x2, y2: Integer): TRect; begin Result.Left := Min(x1, x2); Result.Right := Max(x1, x2); Result.Top := Min(y1, y2); Result.Bottom := Max(y1, y2); end; procedure TFORM_SCREEN.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin isDown := True; downX := X; downY := Y; end; end; {тут я выделил область и принимаюсь за создание скриншота и его сохранение} procedure TFORM_SCREEN.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var jpg: TJPEGImage; begin if Button = mbLeft then // ЛКМ begin isDown := False; jpg := TJPEGImage.Create; try Bild := CaptureScreenRect(GetRectByCoord(downX, downY, X, Y)); jpg.Assign(Bild); Inc(SCREEN_COUNT); jpg.SaveToFile(SCREEN_PATH + 'Screen_' + IntToStr(SCREEN_COUNT) + '.jpg'); finally FreeAndNil(Bild); FreeAndNil(jpg); self.Close; end; end; end; procedure TFORM_SCREEN.FormShow(Sender: TObject); // создание битмапа в onShow begin Bild := TBitMap.Create; end; полагаю дело в переменной Bild ? подскажите, что не так? |
#2
|
|||
|
|||
черт) разобрался, нагуглил ответ...
проблема была в том, что я заранее создаю Bild: tbitmap.create; Но при использовании функции он создается второй раз: Код:
function CaptureScreenRect(aRect: TRect): TBitMap; var ScreenDC: HDC; begin Result := TBitMap.Create; //<---------- тут) Result.Width := aRect.Right - aRect.Left; Result.Height := aRect.Bottom - aRect.Top; ScreenDC := GetDC(0); try BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, ScreenDC, aRect.Left, aRect.Top, SRCCOPY); finally ReleaseDC(0, ScreenDC); end; end; |