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

Пустой Bitmap на Android


x11

Вопрос

По совету krapotkin`a

http://fire-monkey.ru/topic/4595-listview-скрывает-повторяющийся-текст-заголовков/?do=findComment&comment=29209

 

Забросил LiveBinding при заполнении TListView и начал заполнять ручками.

Почти всё хорошо за исключением загрузки картинки из базы.

При использовании LiveBinding картинка грузилась, а теперь просто пустота.

На Windows картинки грузятся и отображаются, а на Андроиде не хотят.

 

Вот часть кода загрузки

Var
stream: TBlobStream;
...
begin
....
lv.BeginUpdate;
  try
    lv.Items.Clear;

    qObjects2.close;
    qObjects2.Open;

    while not qObjects2.Eof do
    begin
      item := lv.Items.Add;
      item.Data[sItemId]    := qObjects2id.AsString;
      item.Data[sItemPrice] := qObjects2price.AsString;
      item.Data[sItemType]  := qObjects2type_name.Value;
...
...
...
      ListItemImage := Item.Objects.FindObjectT<TListItemImage>(sItemImg);
      stream := TBlobStream.Create(qObjects2img, bmRead);
      try
        if stream.Size <= 0 then
          ListItemImage.ImageIndex := 0
        else
          ListItemImage.Bitmap := TBitmap.CreateFromStream(stream);
      finally
        stream.Free;
      end;

 

К ListView прикреплен список картинок, где есть картинка-пустышка, которая грузится, если у записи нет картинки.

вот этой строкой ListItemImage.ImageIndex := 0

картинки-пустышки нормально отображаются и на Андроид-устройстве в том числе.

Ошибок нет, а просто пустой TListItemImage там, где должна быть картинка.

Может, я какое-то свойство забыл включить у TListItemImage?

При отладке видно, что картинка загружается из базы.

 

 

Изменено пользователем x11
Ссылка на комментарий

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

  • 0

В общем, спасла одна строка

ListItemImage.OwnsBitmap := True;

Кстати, в справке ни слова о том, что такое OwnsBitmap и как это правильно применять.

stream := TBlobStream.Create(qObjects2img, bmRead);
      try
        if stream.Size <= 0 then
          ListItemImage.ImageIndex := 0
        else
        begin
          ListItemImage.OwnsBitmap := True;
          ListItemImage.Bitmap := TBitmap.CreateFromStream(stream);
        end;
      finally
        stream.Free;
      end;

 

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

это уже подробно разбиралось на форуме. рекомендую почитать у Равиля. там еще про отложенную подкачку битмапов из интернетов

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

Поискал по форуму, нет сообщений Равиля с описанием даже с кратким.

Здесь: http://fire-monkey.ru/topic/4079-listview-в-берлине-и-в-токио/?do=findComment&comment=26973

есть описание:

I.OwnsBitmap:=true; // указываем ListViewItem, чтобы он уничтожал экземпляр картинки при своем уничтожении
Цитата

Если не пользовать Assign, а напрямую присваивать I.Bitmap=ImageList1.Bitmap(.... , то при уничтожении ListViewItem возникает invalid Pointer, поскольку в TListItemImage.Destroy картинка уничтожается без всяких проверок - есть ли жизнь на марсе, нет ли жизни на марсе ли она вообще.

 

Но оно непонятно как относится к созданию.

 

А здесь пишут:

http://fire-monkey.ru/topic/3014-ne-otobrazhaetsya-tlistitemimage/?do=findComment&comment=18113

Что в событии "OnUpdateObjects" должно быть наоборот - в False.

Причем, я так понял, что OwnsBitmap должно быть раньше создания картинки.

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

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

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

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

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

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

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

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

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

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