• 0
Rusland

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

Вопросы

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 добавлю вопрос позже.

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


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

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

  • 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

Похоже в последнем патче Токио и эту проблему решили. Еще бы подергивания в ЛистВью убрали...

Изменено пользователем Rusland

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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; С меня лайк)))

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От ice donkey
      Заполняю ListView в рантайме:
       
       
      LiveBindings не подходит, поэтому есть вопрос: а как задать фиксированный заголовок - чтобы в списке все Items, начинающиеся с буквы А были как бы объединены под одним заголовком А? Который  в свою очередь смещался бы только заголовком Б (с Items, которые на букву Б) и так далее.
       
      Пример:
       
    • От Olexander Sagaydak
      Летом 2016 вопрос отображения объектов в ListView при создании Items уже обсуждался. Хочу ещё раз обсудить этот вопрос. А именно:
      Простой код 
      ListViewItem := ListView.Items.Add;
      ListViewItem.Objects.AccessoryObject.Visible := false; (или true, не важно)
      вторая строка не работает если до выполнения, ListView ни одного раза не отображался. Если же отображался хотя бы один раз - всё нормально.
      В предыдущих обсуждениях Krapotkin рекомендовал Resize и OnUpdateObjects. Если нет идей проще, то, конечно, воспользуюсь.  
       
    • От x11
      Если у элементов, идущих подряд одинаковый текст, то текст скрывается.
      Как это это отключить?
       
    • От x11
      Не понять, ни в справке найти, ни примеров, как получить текст из header.
      Как получить текст из какого-то элемента, есть пример:
      lvContacts.Items[li.Index].Objects.FindObjectT<TListItemText>('textTel').Text; а для заголовка ил подвала не нахожу примеров
    • От Просто Проги
      Привет всем,Суть такова вот эта процедура не работает что не правильно ? или LsImage не может так делать напрямую как делал Listbox ?
      делаю в цикле
      for I := 0 to Length(tovar)-1 do
       begin
      TListItemImage(Item.Objects.FindDrawable('Img')). Bitmap.LoadFromUrl(tovar.img);
      end;
      В товар находится адрес картинки всё как бы правильно, но не выгружает(
    • От geotub
      Уважаемые знатоки! Здравствуйте!
      с FMX дружу плохо! Задача тривиальная прошу помощи!
      есть соединение с MYSQL через Bind Visual привязан к StringGrid, данные отображаются идеально все хорошо!
      Задача слеждующая:
      - есть колонка "status" со значениями от 0 до 10 
      - есть imageList с картинками в таком же диапазоне 
      Необходимо в StringGgrid вместо значений выводить картинку из imageList равную значению (значение 3 = номер imageList = 3 и тд) 
      Пробовал все Варианты ничего не выходит! Пожалуйста помогите!
    • От x11
      Через LiveBinding загружаются данные в ListView, в том числе и в ListItemImage.
      Но у некоторых Item`ов нет картинки. И в этом случае нужно показать "пустышку" типа No image.
      Делаю в событии UpdateObjects
      procedure TfmMain.lvObjectsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); Var ListItemImage: TListItemImage; begin if Assigned(AItem) then begin ListItemImage := AItem.Objects.FindObjectT<TListItemImage>('img'); if Assigned(ListItemImage) then if not assigned(ListItemImage.Bitmap) then ListItemImage.ImageIndex := 0; end; end;  
      Но теперь у всех ListItemImage отображается пустышка, даже там, где должна быть правильная картинка.
      Пробовал использовать событие UpdatingObjects, но в этом случае грузится правильная картинка, а пустышка не грузится.
    • От Erlan_krg
      Всем привет! Встретился с одной проблемой. Удаляю Item у ListView по нажатию кнопки, которая находится на ListViewItem
      procedure TfmAppointment.lvSelectedServicesButtonClick(const Sender: TObject;
        const AItem: TListItem; const AObject: TListItemSimpleControl);
      begin
          lvSelectedServices.BeginUpdate;
          if lvSelectedServices.ItemCount > 0 then
              lvSelectedServices.Items.Delete(AItem.Index);
          lvSelectedServices.EndUpdate;
      end;
      итем удаляется, но потом выскакивает ошибка Access violation at address 60BCB318 и то се бо се
       
      у ListView ItemAppearance выставлен на DynamicAppearance
      помимо родного объекта Text добавил еще один объект Text и кнопку
       
      но фишка в чем, если убрать дополнительный объект Text с ListWiewItem и удалить итем то ошибка не выскакивает)
       
      что за прикол?
    • От sinuke
      Доброго дня, форумчане
      Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить
      У кого какие мысли? Как реализовать?
      Delphi 10.2 Tokyo
       
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу