【问题标题】:Delphi Exception error loading remote imageDelphi 异常错误加载远程图像
【发布时间】:2019-06-30 12:30:22
【问题描述】:

您好,我有以下代码:

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;

大多数情况下它都可以正常工作,但我不断收到异常错误,有时会出现“找不到图像”(尽管图像确实存在)。

如果我设置 sleep(5000) 一切正常。

所以我假设在我尝试添加到 TImage 之前图像尚未被接收。

有没有更好的使用方法?

【问题讨论】:

  • 嗯,你把异常中的诊断信息扔掉了,所以,.......
  • 在地址 01014323 的访问冲突...读取地址 00000030
  • 您在问题“图片未找到...”中报告的错误是您自己的错误消息。正如所指出的,您的异常处理程序完全忽略了实际的异常,只是假设找不到您的图像,而实际上,它可能是其他东西。现在您提到访问冲突。那是您实际在这里捕获的异常吗?那就是调试时断点停止的地方吗?
  • 我的建议是花一些时间提高你的调试技能
  • @Frank "读取地址 00000030" - 访问接近 0 的地址通常意味着在某处使用了 nil 指针

标签: delphi


【解决方案1】:

您可以使用其他组件来加载图片:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2014-12-18
    • 2014-08-10
    • 2011-11-27
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多