Показать сообщение отдельно
  #1  
Старый 26.03.2022, 15:09
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Не могу понять где утечка

Есть форма, на ней кнопка, клик по ней вызывает другую форму, она полупрозрачная, на ней выделяю область экрана и делаю скриншот этой области.. в ходе работы программы всё нормально... При закрытии программы выдает уведомление:


вот код той формы, в которой создается 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 ?
подскажите, что не так?
Изображения
Тип файла: png aaaa.png (28.7 Кбайт, 4 просмотров)
Ответить с цитированием