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

ListView в Берлине и в Токио


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:   intel-Tokyo.thumb.png.a1bb604ecb87f98a637b5f61cd6f0ad0.png

На Lenovo:Lenovo-Tokyo.thumb.png.c994ea529008d902de22799bf236e782.png

 

Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.

Про Berlin добавлю вопрос позже.

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

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

  • 0

Вот так сделайте:

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
  begin
    oConnectImage.OwnsBitmap:=True;
    oConnectImage.ImageIndex:=r;
  end;
  ...
end;

Добавьте строчку oConnectImage.OwnsBitmap:=True. В соседней теме я долго бился над этим.

Ссылка на комментарий
  • 0
В 15.04.2017 в 11:13, Евгений Корепов сказал:

Добавьте строчку oConnectImage.OwnsBitmap:=True. В соседней теме я долго бился над этим.

К сожалению, это не помогло. Какая-нибудь из картинок обязательно теряется

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

Попробуйте избавится от ImageList на время тестов, замените на TArray<TBitmap> к примеру. Так же попробуйте после oConnectImage.ImageIndex:=r; делать oConnectImage.Bitmap.SaveToFile('d:\0\'+Автоинкремент+'.jpg'). У меня в подобной ситуации несколько процентов картинок в папке 'd:\0\' были черными, видимо пустые, отказался по этой причине от связки ImageList и ListView.

Изменено пользователем Евгений Корепов
Ссылка на комментарий
  • 0

такая же проблема, но сделано все проще- у ListView выставлено свойство Images, Items создаются программно, у них выставляется ImageIndex.

Как бы стандартный путь, но... В винде работает, а на смартфоне нет картинок (((

UPD:

Моё решение проблемы неотображаемых картинок в ListBoxItem на смартфоне (Android)

1. Картинки находятся в ImageList1, размер 40х40

2. ListView обычный стандартный без переделок,

3. Delphi 10.2 Tokyo

procedure TMyForm.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var I:TListItemImage;
    B:TBitmap;
begin
  I:=AItem.Objects.FindDrawable('I') as TListItemImage; // такое имя у стандартного ListViewItem без всяких кастомизаций
  if I<>nil then begin
    B:=ImageList1.Bitmap(tsizef.Create(40,40),I.ImageIndex); // вытаскиваем картинку по индексу, который задан ранее при заполнении ListView
    I.OwnsBitmap:=true; // указываем ListViewItem, чтобы он уничтожал экземпляр картинки при своем уничтожении
    I.Bitmap:=TBitmap.Create; //создаем картинку, которая будет автоматом уничтожена
    I.Bitmap.Assign(B); // и копируем в нее контент
  end;
end;

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

Изменено пользователем marsden
Ссылка на комментарий
  • 0
В 15.04.2017 в 16:13, Евгений Корепов сказал:

Вот так сделайте:


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
  begin
    oConnectImage.OwnsBitmap:=True;
    oConnectImage.ImageIndex:=r;
  end;
  ...
end;

Добавьте строчку oConnectImage.OwnsBitmap:=True. В соседней теме я долго бился над этим.

сутки бился, это реально выручило ImageObject.OwnsBitmap:=true; С меня лайк)))

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

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

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

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

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

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

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

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

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

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