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

Где указать ownerBitmap := true (ImageListItemBottomDetail)


Dmitry Stolyarov

Вопрос

Подскажите, пжл, как прописать  ownerBitmap := true  при режиме LV - ImageListItemBottomDetail ? 

проблема в том, что картинке по URL на MacOS не грузятся совсем.. под Win все работает.

как я понял из форума причина в ownerBitmap , но как его прописать не понимаю...

procedure TfmMain.lvSostavUpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
begin
if FlvSostavUpdating then
  exit;
 //LV в режиме редактирования списка
 if FlvSostavStateEdit then
  begin
   if (AItem.Purpose <> TListItemPurpose.Header)and (AItem.Objects.AccessoryObject <> nil) then
    begin
     AItem.Accessory:= TAccessoryType.Checkmark;
     AItem.Objects.AccessoryObject.Visible := FChecked.Contains(AItem.Tag);
    end
  end else AItem.Accessory:= TAccessoryType.Detail;
end;

procedure TfmMain.lvSostavUpdatingObjects(const Sender: TObject;
  const AItem: TListViewItem; var AHandled: Boolean);
begin
if FlvSostavUpdating then
  exit;
 //LV в режиме редактирования списка
 if (AItem.Data['sign_Loaded'].AsInteger = 0)and(AItem.Purpose <> TListItemPurpose.Header) then
  begin
   AItem.Data['sign_Loaded'] := 1;
   LoadBitmapFromURL(AItem.Data['sign_URL'].AsString, AItem, AItem.Bitmap, rcImg);
  end;
end;

Картинки загружаю по URL в отдельном потоке

procedure TfmMain.LoadBitmapFromURL(const AURL: string; const AItem: TListViewItem; aBitmap: TBitmap; aSourceBmp: TRectangle);
var
  K: Integer; // Анонимная процедура захватывает локальную переменную, а не обращается к AItem, которой уже может не быть в момент _окончания_ скачивания фотки
  FHTTPClient : THTTPClient;
  ResourceStream: TResourceStream;
begin
 if Not Assigned(AItem) then
  Exit;
 if AItem.Data['ImageState'].AsInteger <> lvStudentsItemImageEmpty then
  Exit;
  if AURL.IsEmpty then
  begin
   AItem.Data['ImageState'] := lvStudentsItemImageLoading;
   ResourceStream := TResourceStream.Create(hInstance, 'PngImage_1', RT_RCDATA);
   ResourceStream.Position := 0;
   aSourceBmp.Fill.Bitmap.Bitmap.LoadFromStream(ResourceStream);
   FreeAndNil(ResourceStream);
   if not aSourceBmp.Fill.Bitmap.Bitmap.IsEmpty then
    begin
     aBitmap.SetSize(aSourceBmp.Fill.Bitmap.Bitmap.Width, aSourceBmp.Fill.Bitmap.Bitmap.Height);
     aBitmap.Assign(aSourceBmp.MakeScreenshot);
     AItem.Data['ImageState'] := lvStudentsItemImageLoaded;
    end;
   exit;
  end;


 AItem.Data['ImageState'] := lvStudentsItemImageLoading;
 K := AItem.Index;// Запоминаем индекс в локальную K, которая уйдёт в анонимку (время жизни K > времени жизни анонимки)
 FHTTPClient := THTTPClient.Create;
 FAsyncResultList.Items[K] := FHTTPClient.BeginGet(
  procedure (const ASyncResult: IAsyncResult)
   var
    AHTTPResponse: IHTTPResponse;
   begin
    if ASyncResult.IsCancelled then
     Exit;
    try
     AHTTPResponse := THTTPClient.EndAsyncHTTP(ASyncResult);
     if Not Assigned(AHTTPResponse) then
      Exit;
     if AHTTPResponse.StatusCode <> 200 then
      Exit;
    except
     Exit;
    end;

    TThread.Synchronize(Nil,
     procedure
      begin
       if FlvSostavUpdating or ASyncResult.IsCancelled then // Выходим, так как внутри анонимной процедуры AItem - не сброшены в nil, хотя их уже может и не быть
        Exit;
       if Not Assigned(AItem) then
        Exit;

       aSourceBmp.Fill.Bitmap.Bitmap.LoadFromStream(AHTTPResponse.ContentStream);
       if not aSourceBmp.Fill.Bitmap.Bitmap.IsEmpty then
        begin
         aBitmap.SetSize(aSourceBmp.Fill.Bitmap.Bitmap.Width, aSourceBmp.Fill.Bitmap.Bitmap.Height);
         aBitmap.Assign(aSourceBmp.MakeScreenshot);

         AItem.Data['ImageState'] := lvStudentsItemImageLoaded;
         FAsyncResultList.Items[K]:= nil;
        end
      end
      );
   end, AURL
   );

end;

Под WIN все грузится, под MacOS нет...

 

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

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

  • 0

Вы проверьте на MacOS  загружает ли в битмап

поймите, что в MacOS есть ограничения на доступ к сети, также как и в Андроид

может банально у Вас нет прав на доступ в сеть

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

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

Изменено пользователем Dmitry Stolyarov
Ссылка на комментарий
  • 0
В 28.08.2019 в 15:41, Dmitry Stolyarov сказал:

 Delphi 10.3 Community Edition.

Сделал без потока - все грузится.

Проблема в потоке, такое ощущение что он умирает не отработав/не запустившись.

Смотрите, вот ваш код:

procedure TfmMain.LoadBitmapFromURL(const AURL: string; const AItem: TListViewItem; aBitmap: TBitmap; aSourceBmp: TRectangle);
var
  K: Integer; // Анонимная процедура захватывает локальную переменную, а не обращается к AItem, которой уже может не быть в момент _окончания_ скачивания фотки
  FHTTPClient : THTTPClient;
  ResourceStream: TResourceStream;
begin

Вы используете асинхронный вызов FHTTPClient.BeginGet , начинает выполнятся HTTP запрос, одновременно процедура LoadBitmapFromURL завершает работу и компилятор уничтожает локальные переменные, включая FHTTPClient. Асинхронные вызовы с получением результат происходят уже после уничтожения FHTTPClient и естественно ничего не работает. Вод виндой работает случайно - из за другой модели управления памятью.

У вас несколько путей:

1. Сделать FHTTPClient глобальным - лучший и простой путь.

2. Создавать поток самостоятельно, использовать в нем FHTTPClient.Get (не асинхронный)

3. И еще куча вариантов....

Посмотрите как реализовано у меня (по первому варианту) 

 

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

Вариант № 1 - не помогло. 

странно, но пример из ссылки "Helper для TBitmap - асинхронная" не работает на андроиде - после запуска картинки не отображаются в листвью.. 

при этом под OSX работает.. как теперь это запустить под андройдом фиг пойми..

поделитесь, пжл, рабочим кодом под Андроид загрузки картинок в листвью в отдельном потоке.

 

Изменено пользователем Dmitry Stolyarov
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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