Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про отчистку памяти. [D6, XP]


vegarulez ©   (2007-08-15 14:10:00) 

Привет всем мастерам! У меня такой вопрос... у меня в приложении несколько форм, каждая форма разворачивается на весь экран, на канву помещается изображение + там 1 или два Image на форме имеются... так вот я заметил в диспетчере задач,  что когда от формы к форме переключаюсь, то память приложения увеличивается... и при этом когда форму закрываю... она не уменьшается... при последующем открытии опять увеличивается... я так полагаю потом что мой метод onPaint формы не коректно работает... вернее работает то коректно скорее всего, но при закрытии в памяти видимо висит изображение, а при повторном открытии берётся новое... при том что старое остаётся в памяти... Подскажите как правильно быть в этой ситуации? а то чем больше раз на форму захожу тем больше системной памяти отъедается... хоть и по чуть-чуть... но всё равно...


...
private
 Bitmap: TBitmap;
...
procedure TForm2.FormCreate(Sender: TObject);
begin
...
       Bitmap := TBitmap.Create;
       Bitmap.LoadFromFile('./picture/skin1.png');
...
end;
...

procedure TForm2.FormPaint(Sender: TObject);
begin
    Image2.Picture.Bitmap.LoadFromFile('./picture/' + Form1.a + '1.png');
    Canvas.StretchDraw(Rect(0,0,Form1.Width,Form1.Height),Bitmap);
    Canvas.StretchDraw(Rect(0,140,200,240),Image2.Picture.Bitmap);
end;
...
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Image2.Picture.Bitmap.FreePixmap;
end;


vegarulez   (2007-08-15 18:12:00) [1]

Ничего не понимаю что происходит... поменял где надо close и hide, но теперь другая проблема...
почему то теперь при методе он паинт на второй форме...


Сanvas.StretchDraw(Rect(0,0,Form1.Width,Form1.Height),BMPFORM);
Canvas.StretchDraw(Rect(0,140,200,240),Image2.Picture.Bitmap);

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

а в этом случае когда работает один из блоков - он нормально отрабатывает...


Сanvas.StretchDraw(Rect(0,0,Form1.Width,Form1.Height),BMPFORM);
//Canvas.StretchDraw(Rect(0,140,200,240),Image2.Picture.Bitmap);

допустим тока чтобы канва формы была...


//Сanvas.StretchDraw(Rect(0,0,Form1.Width,Form1.Height),BMPFORM);
Canvas.StretchDraw(Rect(0,140,200,240),Image2.Picture.Bitmap);

или обратная ситуация тока рисунок без канфы формы

в чём дело не могу понять, раньше же всё нормально было - оба блока вместе сосуществовали, и оба прорисовывались постоянно при изменениях на форме...
Подскажите что нет так?...


Ega23   (2007-08-15 16:06:00) [2]


> то при повторном обращении к форме (Form2.Show) у меня тут
> же выскакивает эксцепшн...


Естественно. Ты пытаешься вызвать удалённую форму.
Смотри разницу между Close и Hide.


vegarulez   (2007-08-15 16:01:00) [3]

просто если я использую при онклозе - Bitmap.Free,
то при повторном обращении к форме (Form2.Show) у меня тут же выскакивает эксцепшн...
потому как он видимо онпаинтом пытается прорисовать канву... а прорисовывать то нечего... т.к. Bitmap.Free

DVM ©   (15.08.07 15:13) [5] потому что

program Project1;
...
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.CreateForm(TForm2, Form2);
 ...
 Application.Run;

Именно поэтому...
А также, потому, что каждый раз, при обращении к форме имажи должны меняться на другие.

Ega23 ©   (15.08.07 15:13) [4]
Ну я это понимаю.. но как тогда быть с эксцэпшином?


Ega23   (2007-08-15 15:13:00) [4]


> Так я же Bitmap токо 1 раз создаю... при формкриэте...
> при форм шоу, и при паинт - он тока обращается к этому битмапу.
> ..
> а не подгружает опять...


Да, но в OnClose ты кго не убиваешь. Сам создал - буть любезен сам убить.


DVM   (2007-08-15 15:13:00) [5]


> Image2.Picture.Bitmap.LoadFromFile('./picture/' + Form1.
> a + '1.png');

почему бы вот это не отправить тоже в OnCreate?


Сергей М.   (2007-08-15 15:04:00) [6]


> чото не понимаю?


Да не то что "чото" - "ваще ничиво", видимо, не понимаешь)


vegarulez   (2007-08-15 14:22:00) [7]

Так я же Bitmap токо 1 раз создаю... при формкриэте...
при форм шоу, и при паинт - он тока обращается к этому битмапу...
а не подгружает опять...

Или я чото не понимаю?


Сергей М.   (2007-08-15 14:14:00) [8]


> при этом когда форму закрываю... она не уменьшается


С чего бы ей уменьшиться ?

Где Bitmap.Free ? Нет его, судя по коду.


Наверх

Титульная страница Поиск, карта сайта Написать письмо