Подскажите, пжл, как прописать 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;
Вопрос
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 нет...
Ссылка на комментарий
10 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.