问题描述
如何使用TNetHTTPClient或TNetHTTPRequest从URL获取图片并将其放在timage中? 我是初学者,正在使用Delphi-10.3-Rio。
我编写了一个简单的测试应用程序,但无法正常运行。
我使用了TNetHTTPClient和TNetHTTPRequest
object NetHTTPClient: TNetHTTPClient
Asynchronous = False
ConnectionTimeout = 60000
ResponseTimeout = 60000
HandleRedirects = True
AllowCookies = False
UserAgent = 'Embarcadero URI Client/1.0'
OnAuthEvent = NetHTTPClientAuthEvent
Left = 7
Top = 2
end
object NetHTTPRqstPicture: TNetHTTPRequest
Asynchronous = False
ConnectionTimeout = 60000
ResponseTimeout = 60000
MethodString = 'GET'
Client = NetHTTPClient
OnRequestCompleted = NetHTTPRqstPictureRequestCompleted
Left = 103
Top = 5
end
implementation
{$R *.dfm}
const
cUrlPicture = 'http://192.168.1.3/local/fflprapp/tools.cgi?action=getimage&name=56/20200823171910_718702lp_PA088VI_463274.png';
procedure TForm1.btnGetPictClick(Sender: TObject);
begin {0}
NetHTTPRqstPicture.Get(cUrlPicture);
end;
procedure TForm1.NetHTTPClientAuthEvent(const Sender: TObject; AnAuthTarget: TAuthtargettype;
const ARealm,AURL: string; var AUserName,APassword: string; var AbortAuth: Boolean;
var Persistence: TAuthPersistenceType);
begin {0}
if AnAuthTarget = TAuthtargettype.Server then
begin
AUserName := 'root';
APassword := 'ACCC8ED325EF';
end;
end;
procedure TForm1.NetHTTPRqstPictureRequestCompleted(const Sender: TObject;
const AResponse: IHTTPResponse);
var
strm : TStream;
pngImg : TPNGImage;
begin {0}
strm := TStream.Create;
pngImg := TPNGImage.Create;
strm := AResponse.ContentStream;
pngImg.LoadFromStream(strm);
imgPict.Picture.Graphic := pngImg;
FreeAndNil(pngImg); // OK always
FreeAndNil(strm); // Here is something strange.
end;
end.
---这是FreeAndNil(strm)的执行方式---
第一次点击btnGetPict-一切正常
第二次单击btnGetPict-出现一条消息: 模块中地址00407F74的访问冲突 'ProjGetPicture.exe'。 读取地址FFFFFFFD。
第三次单击btnGetPict-一切正常
第四次单击btnGetPict-再次发出相同的消息,依此类推。
我不知道为什么。
如果我删除FreeAndNil(strm);
一切都OK,但这是一个泄漏内存。
var
strmG : TStream;
procedure TForm1.FormCreate(Sender: TObject);
begin
strmG := TStream.Create;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(strmG);
end;
// and use strmG instead strm in:
// strmG := AResponse.ContentStream;
// pngImg.LoadFromStream(strmG);
一切都在运行....,直到出现相同的消息时,程序才关闭。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)