• 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гб оперативной памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

10 ответов на этот вопрос

  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

вы представляете что будет если на каждую отрисовку ячейки лазить в файл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Изменено пользователем Володимир Антонашко

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

замечательно работает. я специально проверил. присваивается стринг

скриншот ImageList приведите 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

а как на мобиле! в гриде! оказались такие фотомонстры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Rusland
      Delphi Tokyo
      ListView->ItemAppearance->ItemAppearance=DynamicAppearance
      Есть ImageList c 3 картинками.
      Добавляю item-ы в ListView:
      procedure TForm1.Button1Click(Sender: TObject); var i:integer; Lvi: TListViewItem; begin LsvObjects.BeginUpdate; LsvObjects.Items.Clear; try for i:=0 to 100 do begin Lvi := LsvObjects.Items.Add; Lvi.Tag := i; Lvi.Data['ObjectText'] := 'ObjectText '+i.ToString; Lvi.Data['StateText'] := 'StateText '+i.ToString; Lvi.Data['ConnectText'] := 'ConnectText '+i.ToString; end; finally LsvObjects.EndUpdate; end; end; в UpdateObjects рандомно выбираю картинку:
      procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var ... oConnectImage: TListItemImage; r: integer; begin r:=Random(ImageList1.Count); oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage; if (oConnectImage<>nil) then oConnectImage.ImageIndex:=r; ... end; В Windows все нормально. А вот что я вижу на планшетах:
      На Dexp:   
      На Lenovo:
       
      Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.
      Про Berlin добавлю вопрос позже.
    • Автор: Илья Захаров
      Есть панелька alTop на этой панельке лежит компонент ImageViewer c картинкой. Как сделать так чтобы картинка притягивалась к правому краю главной формы с определёнными отступами и при этом находилась на панельке, а так же чтобы она была всегда поверх всех компонентов на форме... Так же при масштабировании на разные экраны она уменьшалась и увеличивалась пропорционально но при этом отступы от правого и верхнего края не изменялись?? А так же вопрос по панелькам как изменять их цвет чтобы у разных панелей разный цвет.

    • Автор: Сергей Сергеев
      Привет всем!
      Поймал такой глюк - пока только на одном устройстве - Samsung gt i9505 andr 4.2.2 - ядро 3.4.0, на десятке других не замечено.
      Delphi Seattle 6.1 b 7601 - win 7 - 64  Android SDK 25.2.2.-32 bit
      Создал форму, на нее кнопку , ImageList - загрузил одну иконку 32*32 
      из 10 запусков - один с картинкой на кнопке , 9 - без.. причем она вроде есть.. но как марево из точек..
      тоже самое с Glyph ( добавил), а в TImage ( добавил) - где изображение загружено напрямую в битмап - все ок.
      Что делать - как обойти?Спасибо всем заранее..
       
    • Автор: RoschinSpb
      Статья: http://community.embarcadero.com/blogs/entry/timagelist101ru-1 Автор: Сергей Рощин Обзор новых возможностей, которые появились в компоненте и редакторе TImageList для Delphi R101 (2016 год, Version 24)
    • Автор: Platon
      Вообще несколько вопросов по данной теме, буду рад если тыкните на документацию embarcadero.
      В данный момент apk моего приложения весит ~90мб и помещается оно на sd-карту.
       
      1. Сколько весит пустой apk с одной формой?
      2. Как устанавливать apk на телефон? Где можно это указать в IDE?
      3. Как можно уменьшить размер apk? Убрать лишние библиотеки? Может как-то еще? 
      4. В своем приложении я использую много картинок, каждая в среднем занимает ~100кб. Это нормальный размер для картинок? Или можно и лучше использовать меньший размер? Но тогда качество будет ужасным.
    • Автор: rareMax
      Что то не могу найти в fmx класс TImageList - есть ли он вообще? Если его нет, дайте совет где хранить изображения(смайлы, штук 20). Спасибо.
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу