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

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


AndroidHalfNoob

Вопрос

Что то не могу догнать: загрузил в 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 эмодзи.

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

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

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

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