Перейти к содержанию
Fire Monkey от А до Я
  • 0

Освобождение памяти. И перерисовка Tcolumn.


Вопрос

Здраствуйте.

В программе я заполняю Tgrid изображениями из Imagelist по имени фото который есть в ячейке . Код :

  if column.index = 8 then    //Загрузка картинок.
    if not value.IsEmpty then
      begin
        column.BeginUpdate;
        i:=StrToInt(maingr.Cells[column.Index,row]);
        imageindex:=main_form.ImageList1.Source.IndexOf(IntToStr(i));
        column.Canvas.Clear(RowColor.Color);
        main_form.ImageList1.draw(column.Canvas,bounds,imageindex,100);
        column.EndUpdate;
      end;

Если я уберу очистку канвы то изображения накладуються. А так как есть следующий раз при вызове DrawColumnCell изображение остается только в последней записи.

Но такой код в  процедуре SelectCell нормально отображает изображение. На каждый вызов. Даже если изображение в ячейке нету.

if acol = 8 then
  begin
          i:=maingr.Cells[Acol,Arow];
          imageindex:=main_form.ImageList1.Source.IndexOf(i);
          imageviewer1.Bitmap.Clear(TAlphaColors.Null);
          imageviewer1.Bitmap:=main_form.ImageList1.Bitmap(size,imageindex);
	end;

И по поводу памяти. Как я понял, после того как я присвою изображение ячейке, оно загружается в память. Также когда отображается в ImageViewer.

Но после удаления строки с изображениям, память остается занята для уже использованных изображений.  То есть при повторном показе память больше не занимается и используется изображение которое было ранее загружено. Думаю это нормальное поведение. Так увеличивается скорость работы программы. Но я собираюсь показывать до 50 фотографий одновременно (средний размер 1мб) из 5-10 тисяч. И мне нужно чтоб после использования изображений память очищалась, иначе программа будет кушать под 10гб оперативной памяти.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Я тут подумал.. Что может я выбрал неправильный путь. Может лучше вообще не загружать все через imagelist? Может в drawcolumncell прописать загрузку напрямую из файла. Но тут проблема что интернете нету толком инструкций как пойти напрямую. Может у кого-то завалялся подходящий кусок кода?

Ссылка на комментарий
  • 0

Представляю.. Я вчера попробовал. Клиенту нужен в таком случае ssd и мощное железо. Да.. Вариант плохой. Есть идеи как организовать по другому.

Ссылка на комментарий
  • 0

у вас есть колонки типа TGlyphColumn и свойство Image у грида

если просто писать в Cell[x,y] номерок, то картинки из ImageList выводятся сами, ничего больше делать не надо

Ссылка на комментарий
  • 0

У меня на версии berlin так работать не хочет. А точнее изображение  выводиться. Но только с индексом 0.

Изменено пользователем Володимир Антонашко
Ссылка на комментарий
  • 0

Извиняюсь. Действительно все правильно работает. У меня ошибка была в другом месте. Но проблема с памятью осталась. Использование всего трех фотографий по 1мб заняли аж 10мб ОЗУ. Мне нужно найти способ освобождать память после удаление фотографий из  stringgrid.

Ссылка на комментарий
  • 0

При первой загрузке фотографии уменьшайте её до адекватных размеров допустим 64x64. Полученную миниатюру добавляйте в ImageList. Для сокращения использования памяти присвойте свойству Dormant значение True. Увеличте значение CacheSize, так, чтобы оно было немного больше количества одновременно видимых картинок.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...