Подскажите, пжл, как прописать 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 нет...