Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Динамическая загрузка и выгрузка картинок


Автор: Gnusss 10.5.2005, 12:58
Привет всем!

Есть у меня форма и при её Показе я загружаю из DLL-ки картинки:
Код

procedure TForm2.FormShow(Sender: TObject);
var
 I: integer;
 PNG: TPNGObject;
 ImageLib: Cardinal;
begin
 ImageLib:= LoadLibrary(pChar(GetMyDir+FileImageLib));
 PNG:= TPNGObject.Create;
 PNG.LoadFromResourceName(ImageLib,'C_SIDEBACK2');
 Image24.Picture.Graphic:= PNG;
 PNG:= TPNGObject.Create;
 PNG.LoadFromResourceName(ImageLib,'C_SIDEBACK1');
 Image5.Picture.Graphic:= PNG;
...
End;
А при скрытии её а пытаюсь их удалить(Мне нужно удалить только картинки не Форму):
Код

procedure TConfig.FreeLoadedPic;
var
 I: integer;
begin
 Image24.Picture.Graphic.Free;
 Image4.Picture.Graphic.Free;
...
End;
Но при следующем(очередном) показе формы выскакивают ошибки. Как я понял это из-за неправильного удаления картинок.
Как мне лучше реализовать загрузку и выгрузку эти картинок.
Цель всего этого: Чтобы картинки не занимали память пока форма не видна.

Заранее спасибо!

Автор: Yanis 10.5.2005, 13:03
Попробуй Image24.Picture.Free

Автор: Poseidon 10.5.2005, 13:10
Код
procedure TConfig.FreeLoadedPic;
var
 I: integer;
begin
 Image24.Picture:= nil;
 Image4.Picture:= nil;
...
End;

Автор: Gnusss 10.5.2005, 13:20
Цитата(Yanis @ 10.5.2005, 13:03)
Image24.Picture.Free

Не помогает!

Цитата(Poseidon @ 10.5.2005, 13:10)
Image24.Picture:= nil;

Это только удаляет указать на Picture но не отчищает память, после нескольких показов и скриыть формы прога стала есть 50> метров памяти

Автор: Yanis 10.5.2005, 13:30
Надо очищать TPNGObject и Image, а ты только Image освобождаешь.

Автор: Gnusss 10.5.2005, 14:07
Мне нужно удалить из памети только катринку.
Сам компонент мне удалять не надо.

Автор: Yanis 10.5.2005, 14:20
После того как ты создаешь объект ты загружаешь в него рисунок вот такой строчкой:
Код

PNG.LoadFromResourceName(ImageLib,'C_SIDEBACK2');
причём после этого ты ещё раз содаёшь объект (зачем???) Нужно один раз содать объект TPNGObject, загружать картинки, а потом в конце процедуры освобождать память из под него:
Код

var
 I: integer;
 PNG: TPNGObject;
 ImageLib: Cardinal;
begin
 ImageLib:= LoadLibrary(pChar(GetMyDir+FileImageLib));
 PNG:= TPNGObject.Create;
 { ... }
 PNG.LoadFromResourceName(ImageLib,'C_SIDEBACK2');
 Image24.Picture.Graphic:= PNG;
 PNG.LoadFromResourceName(ImageLib,'C_SIDEBACK1');
 Image5.Picture.Graphic:= PNG;
 { ... }
  PNG.Free;

Автор: Gnusss 10.5.2005, 15:06
to Yanis Про загрузку спасибо. А что делать с выгрузкой?

Автор: Yanis 10.5.2005, 15:32
Цитата(Gnusss @ 10.5.2005, 15:06)
А что делать с выгрузкой?

Если ты при закрытии своей формы TConfig используешь Free, то ничего не надо делать больше.
А вообще ImageXXX.Picture.Assign(nil);

Автор: Gnusss 10.5.2005, 16:15
to Yanis Большое спасибо.
Цитата(Yanis @ 10.5.2005, 15:32)
ImageXXX.Picture.Assign(nil);

Работает и Отчищает память.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)