• 0
ra.eremeev

Отображение картинок в ListView

Вопросы

Добрый день!

Друзья, помогите, пожалуйста, побороть одну проблему: при загрузке картинок в ListView картинки не отображаются до выполнения какого-либо действия с самим ListView (например, скрола или простого прикосновения к нему). Т.е., требуется прикоснуться к компоненту, чтобы картинки появились.

Проблема возникает только с собственноручно созданным объектом TListViewImage. При использовании для вывода изображений "стандартный" Image (например, ItemAppearance=ImageListItem), проблем не возникает :(

Но иногда требуется больше одного изображения и необходимо создавать свои.

С использованием решения по загрузке изображений из инета от ZuBy сделал минималистичный проект (нет ничего лишнего), отражающий суть проблемы.

Буду ОЧЕНЬ признателен за помощь!

LoadBitmaps.zip

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


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

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

  • 0
16 минут назад, wamaco сказал:

ownerBitmap := true;

Спасибо, но не помогает :(

В проекте это используется в процедуре создания TListitemImage

function TForm1.InsertImageObject(const Name:string; Width, Height:Single; PlaceOffsetX,PlaceOffsetY:Single; HorizAlign,VertAlign: TListItemAlign; AItem:TlistViewItem; LV:TListView):TListItemImage;
begin
  result := aitem.Objects.FindObjectT<TListItemImage>(name);
  if result = NIL then
  result := TListItemImage.Create(AItem);
  Result.Name := Name;
  result.width := Width;
  result.height := Height;
  result.placeoffset.x := PlaceOffsetX;
  result.placeoffset.y := PlaceOffsetY;
  result.Align := HorizAlign;
  result.VertAlign := VertAlign;
  result.OwnsBitmap:=true;
  Result.Bitmap:=TBitmap.Create;
end;

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


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

Неужели никто не сталкивался с таким? Трудно поверить, что я один :(((

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


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

Попробуйте сделать Adapter.ResetView, может поможет

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
28 минут назад, mazayhin сказал:

Попробуйте сделать Adapter.ResetView, может поможет

Спасибо за отклик! В сформированном проекте он используется. Но проблему так и не решает :(

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 27.01.2018 в 22:05, ra.eremeev сказал:

Спасибо, но не помогает :(

В проекте это используется в процедуре создания TListitemImage

function TForm1.InsertImageObject(const Name:string; Width, Height:Single; PlaceOffsetX,PlaceOffsetY:Single; HorizAlign,VertAlign: TListItemAlign; AItem:TlistViewItem; LV:TListView):TListItemImage;
begin
  result := aitem.Objects.FindObjectT<TListItemImage>(name);
  if result = NIL then
  result := TListItemImage.Create(AItem);
  Result.Name := Name;
  result.width := Width;
  result.height := Height;
  result.placeoffset.x := PlaceOffsetX;
  result.placeoffset.y := PlaceOffsetY;
  result.Align := HorizAlign;
  result.VertAlign := VertAlign;
  result.OwnsBitmap:=true;
  Result.Bitmap:=TBitmap.Create;
end;

не там делаете  OwnsBitmap:=true.... сделаете примерно так... (в событии ListView: UpdateObjects)

procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var
  ...
  oConnectImage: TListItemImage;
begin


  oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage;
  if (oConnectImage<>nil) then
  begin
    oConnectImage.OwnsBitmap:=True;
    oConnectImage.ImageIndex:=1;
  end;
  ...
end;
Изменено пользователем wamaco

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
58 минут назад, wamaco сказал:

не там делаете  OwnsBitmap:=true.... сделаете примерно так... (в событии ListView: UpdateObjects)


procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
var
  ...
  oConnectImage: TListItemImage;
begin


  oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage;
  if (oConnectImage<>nil) then
  begin
    oConnectImage.OwnsBitmap:=True;
    oConnectImage.ImageIndex:=1;
  end;
  ...
end;

Получается, что там же :(  InsertImageObject (в котором у меня  OwnsBitmap:=true) используется в ListViewUpdateObjects.

Т.е., то же самое, что в указанном Вами примере... 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
21 минуту назад, wamaco сказал:

приложите целиком проект

Он приложен. В самом первом сообщении. Дублирую

LoadBitmaps.zip

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


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

Выкладываю решение. Надеюсь, кому-то будет полезно

Есть ощущение, что это очередной костыль, но работает.

Проблема - в необходимости перерисовки вручную добавленного TListItemImage после загрузки его Bitmap в потоке.

 

LoadBitmaps.zip

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 13.02.2018 в 09:22, ra.eremeev сказал:

Выкладываю решение. Надеюсь, кому-то будет полезно

Есть ощущение, что это очередной костыль, но работает.

Проблема - в необходимости перерисовки вручную добавленного TListItemImage после загрузки его Bitmap в потоке.

 

LoadBitmaps.zip

Добрый день!

Использую Ваш пример... и столкнулся с такой же траблой.. (в последнем приложенном файле та же трабла..)

Подскажите, пжл, куда копать..

procedure TForm1.FormCreate(Sender: TObject);
var
  sUrl: string;
  i: integer;
  item:TListViewItem;
begin
 with qLess do
  try
    if qLess.Active then Close;
    Open;
    while not eof do
     begin
      with ListView1 do
       begin
        Item:=listview1.Items.Add;
        Item.Text := qLessLESS_NAME.AsString;
        Item.Detail:= qLessLESS_DESC.AsString;
        Item.Data['URL'] := qLessIMG_URL.AsString;
        Item.Data['loading'] := 0; // даём знать, что можно загрузить картинку
       end;
       next;
     end;
  except
   //
  end;
 end;


procedure TForm1.ListView1Paint(Sender: TObject; Canvas: TCanvas;
  const ARect: TRectF);
var i:integer;
begin
  for i := 0 to ListView1.Items.Count-1 do
  begin
    if (i >= 0) and (i < ListView1.Items.Count) then
    begin
     if  ListView1.Items.Bitmap.Image<>NIL then
      if (ListView1.Items.Data['loading'].AsInteger = 0) then
      begin
        ListView1.Items.Data['loading']:= 1;
        ListView1.Items.Bitmap.LoadFromUrlToListViewItem(ListView1.Items.Data['URL'].AsString, ListView1);
      end;
    end;
  end;
end;

{ TBitmapHelper }

procedure TBitmapHelper.LoadFromUrlToListViewItem(AUrl: string;
  AListView: TListView);
var thread: TThread;
begin
  thread := TThread.CreateAnonymousThread(
  procedure
  var
  NetHTTPClient: TNetHTTPClient;
  Result: TMemoryStream;
  begin
    Result := TMemoryStream.Create;
    NetHTTPClient := TNetHTTPClient.Create(nil);
    try
      try
        NetHTTPClient.Get(AUrl, Result);
        TThread.Synchronize(TThread.CurrentThread,
        procedure()
        var
        tempBitMap: TBitmap;
        begin
          tempBitMap := TBitmap.Create;
          tempBitMap.LoadFromStream(Result);
          if not tempBitMap.IsEmpty then
          begin
            self.Assign(tempBitMap);
            AListView.Paint;
          end;
        end);
        except
        Result.Free;
      end;
      finally
      NetHTTPClient.Free;
    end;
  end);
  thread.FreeOnTerminate := true;
  thread.start;
end;

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


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

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

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

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

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

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

Войти

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

Войти

  • Последние посетители   0 пользователей онлайн

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