Ошибка Delphi Exception при загрузке удаленного образа - PullRequest
0 голосов
/ 30 июня 2019

Привет, у меня есть следующий код:

procedure TformInvoiceDetails.ReadWebImage(imgAddress: string);
var
  memStream: TMemoryStream;
begin
  memStream := TMemoryStream.Create;
  try
    IdHTTP1.Get (imgAddress,memStream);
    //sleep(5000);
  except
    imageContProduct.Visible := false;
    ShowMessage('Image not found at:'+imgAddress);
    memStream.Free;
    exit;
  end;
  try
    memStream.Position := 0;
    imageContProduct.Visible := true;
    imageContProduct.Bitmap.LoadFromStream(memStream);
  finally
    memStream.Free;
  end;
end;

Большую часть времени это работает нормально, но я получаю ошибку исключения и иногда 'Изображение не найдено в' (хотя изображение существует).

Если поставить сон (5000), все работает нормально.

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

Isесть лучший метод для использования?

1 Ответ

0 голосов
/ 03 июля 2019

Вы можете использовать другие компоненты для загрузки изображений:

uses WinInet, JPEG;
...
function DownloadToStream(Url: string; Stream: TStream): Boolean;
var
  hNet: HINTERNET;
  hUrl: HINTERNET;
  Buffer: array[0..10240] of Char;
  BytesRead: DWORD;
begin
  Result := FALSE;
  hNet := InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if (hNet <> nil) then
  begin
    hUrl := InternetOpenUrl(hNet, PChar(Url), nil, 0,
      INTERNET_FLAG_RELOAD, 0);
    if (hUrl <> nil) then
    begin
      while (InternetReadFile(hUrl, @Buffer, sizeof(Buffer), BytesRead)) do
      begin
        if (BytesRead = 0) then
        begin
          Result := TRUE;
          break;
        end;
        Stream.WriteBuffer(Buffer,BytesRead);
      end;
      InternetCloseHandle(hUrl);
    end;
    InternetCloseHandle(hNet);
  end;
end;

procedure TformInvoiceDetails.ReadWebImage(imgAddress: string);
var
  memStream: TMemoryStream;
  Jpg:= TJPEGImage;
begin
  memStream:= TMemoryStream.Create;
  try
    if DownloadToStream(imgAddress, memStream) then
    begin
      memStream.Seek(0, soFromBeginning);
      if (LowerCase(RightStr(imgAddress, 4))='.jpg') or (LowerCase(RightStr(imgAddress, 5))='.jpeg')
        try //do the same operation for *.png
          Jpg:= TJPEGImage.Create;
          Jpg.LoadFromStream(memStream);
          imageContProduct.Picture.Bitmap.Assign(Jpg);
          imageContProduct.Visible := true;
        finally
          Jpg.Free;
        end
      else
        try
          imageContProduct.Picture.Bitmap.LoadFromStream(memStream);
          imageContProduct.Visible := true;
        finally
        end;
    end;
  finally
    memStream.Free;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...