Перейти к содержанию
  • Регистрация
  • 0
AndroidHalfNoob

[TListView] Как загрузить картинку в итем TListView из TImageList?

Вопрос

Что то не могу догнать: загрузил в ImageList 2 картинки, а вот в ListView не получается их засунуть.

var  LItem: TListViewItem;

1.jpg

если прописываю прямой путь к файлу на компе, то все работает

 

1.jpg

2.jpg

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


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

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

  • 0
ImageList1.Source.Items[0]

возвращает TCustomSourceItem. А потом вы его почему-то передаете в LoadFromFile?!

Правильно

Вначале вытаскиваем картинку:

var
  ImageListBitmap: TBitmapOfItem;
  
ImageListBitmap := ImageList1.Source.Items[0].MultiResBitmap.Bitmaps[<Текущий Scale формы/экрана>];

Потом ее присваиваем в TListVIewItem:

LItem.Bitmap.Assign(ImageListBitmap);

 

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


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

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

// настройка ListView если хотите в Run-Time
ListView2.Images := ImageList1; // Указываем коллекцию изображений 
                                // которая будет использоваться.
ListView2.ItemAppearanceName := TAppearanceNames.ImageListItem;
ListView2.ItemAppearanceObjects.ItemObjects.Image.Visible := True;
...    
Item := ListView2.Items.Add; // Добавляем новый пункт если надо
if (Item.Objects.ImageObject <> nil) then
begin
  Item.Objects.ImageObject.ImageIndex := Item.Index; // Присваиваем номер изображения 
                                                     // из коллекции изображений
  Item.Text := Format('Item with ImageIndex = %d', [Item.Objects.ImageObject.ImageIndex]); 
end;

А вот тут пример загрузки из файла в ImageList

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


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

 

ImageListBitmap := ImageList1.Source.Items[0].MultiResBitmap.Bitmaps[<Текущий Scale формы/экрана>];

Спасибо за наводку.

Сделал по другому: без лишней переменной

на первом фото видно результат. при 0 грузится первая картинка. если в NumberBox1 поставить 1 то уже другая.

то что мне и надо было.

2.jpg

1.jpg

21 часа назад, RoschinSpb сказал:

А вот тут пример загрузки из файла в ImageList

Вот это хороший пример. думаю что в будущем понадобится организовать загрузку в imagelist картинки.

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

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


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

Em tempo de execução, também pode utilizar o evento: UpdateObjects:

procedure TMainForm.LIstView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  URL_Foto: String;
  Foto: TListItemImage;
  Strm: TMemoryStream;
  TmpImagem: TImage;
  Http: TiDHTTP;
  myThread: TThread;
begin
  Foto := TListItemImage(AItem.View.FindDrawable('FOTO'));
  URL_Foto := TListItemText(AItem.View.FindDrawable('URL_FOTO')).Text;
  TListItemText(AItem.View.FindDrawable('URL_FOTO')).Visible := False;
  if (not URL_Foto.IsEmpty ) and (Foto <> nil) and (Foto.Bitmap = nil) then
  begin
    URL_Foto := 'http://www.SEUDOMINIO.com.br/imagens/' + URL_Foto;
    myThread := TThread.CreateAnonymousThread( procedure ()
    begin
      Strm := TMemoryStream.Create;
      Http := TiDHTTP.Create(Self);
      TmpImagem := TImage.Create(nil);
      livAnuncioCaminhao.BeginUpdate;
      try
        Http.Get(URL_FOTO, Strm);
        if (Strm.Size > 0) then
        begin
          Strm.Position := 0;
          TThread.Synchronize(myThread, procedure ()
          begin
            TmpImagem.Bitmap.LoadFromStream(Strm);
            Foto.OwnsBitmap := False;
            Foto.Bitmap := nil;
            Foto.Bitmap := TmpImagem.Bitmap;
          end);;
        end;
      finally
        Strm.Free;
        Http.Free;
        //Assim dá access violation
        //TmpImagem.Free;
        livAnuncioCaminhao.EndUpdate;
      end;
    end);
    myThread.start();
  end;
end;

 

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


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

Correção:

Substituir: livAnuncioCaminhao.BeginUpdate e livAnuncioCaminhao.EndUpdate
Para: ListView1.BeginUpdate e ListView1.EndUpdate
 

procedure TMainForm.LIstView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  URL_Foto: String;
  Foto: TListItemImage;
  Strm: TMemoryStream;
  TmpImagem: TImage;
  Http: TiDHTTP;
  myThread: TThread;
begin
  Foto := TListItemImage(AItem.View.FindDrawable('FOTO'));
  URL_Foto := TListItemText(AItem.View.FindDrawable('URL_FOTO')).Text;
  TListItemText(AItem.View.FindDrawable('URL_FOTO')).Visible := False;
  if (not URL_Foto.IsEmpty ) and (Foto <> nil) and (Foto.Bitmap = nil) then
  begin
    URL_Foto := 'http://www.SEUDOMINIO.com.br/imagens/' + URL_Foto;
    myThread := TThread.CreateAnonymousThread( procedure ()
    begin
      Strm := TMemoryStream.Create;
      Http := TiDHTTP.Create(Self);
      TmpImagem := TImage.Create(nil);
      ListView1.BeginUpdate;
      try
        Http.Get(URL_FOTO, Strm);
        if (Strm.Size > 0) then
        begin
          Strm.Position := 0;
          TThread.Synchronize(myThread, procedure ()
          begin
            TmpImagem.Bitmap.LoadFromStream(Strm);
            Foto.OwnsBitmap := False;
            Foto.Bitmap := nil;
            Foto.Bitmap := TmpImagem.Bitmap;
          end);;
        end;
      finally
        Strm.Free;
        Http.Free;
        //Assim dá access violation
        //TmpImagem.Free;
        ListView1.EndUpdate;
      end;
    end);
    myThread.start();
  end;
end;

 

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


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

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

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

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

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

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

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

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

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


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

    • От Виталий Иванов
      Есть такая идея. 
      Загружаю в TListView много элементов (от 500 до 1000 может и более) ситуация вынуждает грузить именно столько . Так вот когда начинаю создавать их кастомно после создания приходится вызвать oItem.Adapter.ResetView(oItem) (Если этого не делать то не корректно рассчитывается высота и ещё пару багов )  что соответсвенно вызывает подвисание интерфейса на Windows все круто это не так в глаза бросается, а на Android печалька форма зависает от 10 до 30 секунд 
      Так вот сам вопрос можно ли как это сделать в отдельном потоке что бы пользователю показывать какой нибудь Waiter. Или может кто как по другому предложит реализовать ? 
      Смотрел в сторону динамической подгрузки итемов но хотелось бы что и его поиск работал . 
    • От Alex Bozhko
      Вопрос из серии "чего-то странного хочется".
      Предположим, я хочу написать собственный ListView. Если я наследую от TListView, то всё нормально. Я его регистрирую с помощью процедуры Register
      Примерно так:
      procedure Register; begin RegisterComponents('<Моя вкладка>', [TМойListView]); end; И всё работает.
      Но, как показывает практика, в том числе пример Равиля Зарипова (https://github.com/rzaripov1990/ModernListView) для того, что бы написать полноценный ListView, наследоваться надо от предков TListView, едва ли не от TStyledControl.
      Дальше возникает вопрос. Где и как правильно регистрировать вновь созданный компонент?
      Если зарегистрировать компонент с помощью процедуры Register, то при размещении компонента на форме в окне Structure к вновь созданному компоненту не привязывается ItemAppearence.

       
      Да и IDE падает.
      Прилагаю файл с кастомным ListView. Сделан по аналогии с оригинальным, изменены только названия.
       
       
      My.FMX.ListView.zip
    • От Виталий Иванов
      Вопрос к экспертам
      Возникла необходимость и хотел спросить можно ли как-то сделать TlistViewItem  прозрачным, а то получается что сам TlistView может быть прозрачным а его итем нет . Это как-то же делаться у TListBoxItem. 
      Заранее огромное спасибо.
    • От x11
      ListView в режиме appearance.
      Добавил пару TListItemGlyphButton, указал в свойстве ButtonType - CheckBox. Но при работе приложения - пустота.
      Другие типы кнопок тоже не отображает.
      ЧЯДНТ.
    • От 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
      Сделал такой эксперимент в событии OnUpdateObjects
      if AItem.Purpose in [TListItemPurpose.Header] then Memo1.Lines.Add(AItem.Text);  
      И в memo загрузилось в два раза больше строк, чем элементов списка.
      Это нормально, так и должно быть?
    • От x11
      Не могу понять, что случилось в проекте с TDataModule.
      Проект мультиплатформенный. В прошлый раз сохранил, закрыл, ничего необычного. Сегодня открываю, а мне ошибку Delphi Berlin показывает.
       
      И действительно, у TImageList отсутствует свойство source. Открываю, а он выглядит по-другому, как будто из VCL.
      Закрываю проект, создаю мультиплатформенную форму, кладу TImageList на форму и о чудо - совершенно другой TImageList и свойство Source есть.
      Что случилось с моим TDataModule? Как среде дать понять, что это мультиплатформенный проект?

    • От x11
      Не знаю, куда правильно задать вопрос. Решил здесь.
      Обычная стандартная связка TImageList + TActionList+TSpeedButton.
      в TImageList загрузил картинку 32*32.
      Всё связал и она появилась у кнопки на панели.
      Обратил внимание, что картинка 32*32 маловата и я решил загрузить картинку 48*48.
      Удалил из TImageList картинку и загрузил новую. Но размер картинки на кнопке остался 32*32.
      А потом ещё и исчезла картинка из TActionList.
       
      В TImageList только одна картинка.
      Delphi Berlin.


    • От DrMzi
      Доброго времени суток!
      Собираю тестовый проект под Win, иконки вижу.
      C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\ListViewImageIndex
      Собираю тестовый проект под Android, иконок нет.
      Что я делаю не так ?

      Поправка. Такое поведение у apk на xiaomi mi5, запустил на Philips Xenium - иконки есть. 
       
  • Последние посетители   0 пользователей онлайн

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

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