powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потеря памяти
14 сообщений из 14, страница 1 из 1
Потеря памяти
    #39749978
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день господа )))

Беру форму, кидаю Image,timer,headerControl и скидываю в таймере экран на image.
Переменные очищаю, но происходит постоянная потеря памяти....

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Jpeg,Activex,

  Dialogs, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    HeaderControl1: THeaderControl;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
const
  CAPTUREBLT = $40000000;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Bmp: TBitmap; // BMP ôîðìàò
  jpeg:TJpegImage;
  err:boolean;
begin
           err:=false;
           try
             Bmp:=TBitMap.Create; // ñîçäàþ îáúåêò: èçîáðàæåíèå â ôîðìàòå BMP
             jpeg := TJPEGImage.Create;
             Bmp.Height:=Image1.Height; // ïîäãîíÿþ ðàçìåðû èçîáðàæåíèÿ
             Bmp.Width:=Image1.Width;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='Error create Object Screen';
           end;
           if not(err) then
           try
             BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, screen.Height,
                    GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
             jpeg.Assign(bmp);
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='error copy screen';
           end;
           if not(err) then
           try
             jpeg.CompressionQuality:=100;
             jpeg.Compress;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='error compress jpeg';
           end;

           if not(err) then
           Image1.Picture.Bitmap.Assign(jpeg);
           if not(err) then
           try
            jpeg.Free;
            bmp.Free;
           except
             err:=true;
             HeaderControl1.Sections[0].Text:='Error free';
           end;
end;

end.



Сможете подсказать каким образом избежать этого?
...
Рейтинг: 0 / 0
Потеря памяти
    #39749983
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жуть
...
Рейтинг: 0 / 0
Потеря памяти
    #39749984
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RissСможете подсказать каким образом избежать этого?
Ты сам то понимаешь, что ты там написал ?

Попробуй так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Bmp: TBitmap; // BMP ôîðìàò
begin
 Bmp:=TBitmap.Create;
 try
   ...
 finally
  Bmp.Free;
 end;
end.
...
Рейтинг: 0 / 0
Потеря памяти
    #39749989
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B,

Не обращайте внимание на все - по сути есть так как ты написал.... Ничего не изменится - память все равно будет пропадать

Вы на газету внимания не обращайте - рыбу приходилось заворачивать
...
Рейтинг: 0 / 0
Потеря памяти
    #39749993
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
if not(err) then
... .Free;


А если err? тогда кто будет память освобождать?
...
Рейтинг: 0 / 0
Потеря памяти
    #39749996
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
         try
             Bmp:=TBitMap.Create; // создаю объект: изображение в формате BMP
             jpeg := TJPEGImage.Create;
             Bmp.Height:=Image1.Height; // подгоняю размеры изображения
             Bmp.Width:=Image1.Width;
             BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
                    GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
             jpeg.Assign(bmp);
             jpeg.CompressionQuality:=100;
             jpeg.Compress;
             Image1.Picture.Bitmap.Assign(jpeg);
             jpeg.Free;
             bmp.Free;
           except
             HeaderControl1.Sections[0].Text:='Ошибка';
           end;



Если вас смущает, то пусть будет так
...
Рейтинг: 0 / 0
Потеря памяти
    #39750002
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

Это будет другая тема.... Мне не понятно, где тут присходит потеря памяти?
...
Рейтинг: 0 / 0
Потеря памяти
    #39750004
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riss,

Если где-нибудь между Bmp.Create() и Bmp.Free() будет exception, то что получится?...
Вам же показали как надо делать.
...
Рейтинг: 0 / 0
Потеря памяти
    #39750005
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RissЕсли вас смущает, то пусть будет так
Смущает.
После того как ты написал .Create, следующий операторы должны быть:
Код: pascal
1.
2.
3.
4.
5.
6.
.Create
 try
  ...
 finally
 .Free;
 end;


После того как ты это напишешь, начинаешь думать, что вписать между Try и Finally.
...
Рейтинг: 0 / 0
Потеря памяти
    #39750008
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так всё равно течёт?..
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  try
    jpeg := nil;
    Bmp:=TBitMap.Create; // создаю объект: изображение в формате BMP
    try
      jpeg := TJPEGImage.Create;
      Bmp.Height:=Image1.Height; // подгоняю размеры изображения
      Bmp.Width:=Image1.Width;
      BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height,
         GetDC(0), 0, 0, SRCCopy or CAPTUREBLT);
      jpeg.Assign(bmp);
      jpeg.CompressionQuality:=100;
      jpeg.Compress;
      Image1.Picture.Bitmap.Assign(jpeg);
    finally
      jpeg.Free;
      bmp.Free;
  end;
  except
    HeaderControl1.Sections[0].Text:='Ошибка';
  end;
...
Рейтинг: 0 / 0
Потеря памяти
    #39750012
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RissRWolf,

Это будет другая тема.... Мне не понятно, где тут присходит потеря памяти?

Где-то в районе BitBlt.
Чтобы оперировать хэндлами GDI, нужно их лочить и освобождать — GetDC/ReleaseDC.
Это если отвлечься от дельфовых Create/Free, я по умолчанию считаю, что эксепшенов этот код всё-таки не бросает.
...
Рейтинг: 0 / 0
Потеря памяти
    #39750013
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,
К сожалению
...
Рейтинг: 0 / 0
Потеря памяти
    #39750014
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

Попробую покапать - спасибо
...
Рейтинг: 0 / 0
Потеря памяти
    #39750071
Riss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolf,

Действительно. Прошел вариант

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  SDC: hDC; 


  ...
       SDC := GetDC(0);
       BitBlt(BMP.Canvas.Handle,
                    0,0,
                    bmp.Width, bmp.Height,
                    SDC,
                    0,0,
                    SRCCOPY);
      ReleaseDC(0, SDC);
 ...



Спасибо всем за урок )) Очень признателен ))
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Потеря памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]