Json Delphi索引越界列表
我有一个客户数据库,我想在谷歌地图上查一下,如果找到了坐标,然后更新字段纬度 我的代码如下,但我执行它时,它会返回一个索引超出范围的错误列表。我试图创建一个循环,但有些地方不正确Json Delphi索引越界列表,json,google-maps,delphi,Json,Google Maps,Delphi,我有一个客户数据库,我想在谷歌地图上查一下,如果找到了坐标,然后更新字段纬度 我的代码如下,但我执行它时,它会返回一个索引超出范围的错误列表。我试图创建一个循环,但有些地方不正确 procedure TForm1.btnPegaCoordenadasClick(Sender: TObject); var xTemp: TStringList; endereco : string; tamanho : integer; latitude, customer: st
procedure TForm1.btnPegaCoordenadasClick(Sender: TObject);
var xTemp: TStringList;
endereco : string;
tamanho : integer;
latitude, customer: string;
begin
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
xTemp:= TStringList.Create;
while not qryCustomer.eof do begin
endereco:= qryCustomerENDERECOGOOGLE.Value;
customer := qryCustomerCODE.Value;
IdHTTP1.Request.Accept := 'text/html, */*';
IdHTTP1.Request.UserAgent := 'Mozilla/3.0 (compatible; IndyLibrary)';
IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded';
IdHTTP1.HandleRedirects := True;
xTemp.Text := UTF8Decode(IdHTTP1.Get('http://maps.google.com/maps/api/geocode/json?sensor=false&address='+endereco));
// position latitude
latitude := (xTemp.Strings[63]);
with ps_UpdatesCustomers do begin
Parameters.ParamByName('@latitude').Value := latitude;
Parameters.ParamByName('@customer').Value := customer;
ps_UpdatesCustomers.ExecProc;
close;
end;
qryCustomers.Next;
end;
end;
在尝试访问特定项目之前,需要检查
TStringList
变量xTemp
的长度
if xTemp.Count >= 64 then
// Do something with xTemp[63]
else
raise SomeError
您还应该为stringlist使用
try/finally
块:
xTemp:= TStringList.Create;
try
...
finally
xTemp.Free;
end;
如果发生异常情况,这将避免内存泄漏。您已经硬编码了所读取行的索引:
latitude := (xTemp.Strings[63]);
我看不出你们有什么理由认为第64行将保持纬度,也不认为总有至少64行输出。您得到的异常表明,至少在一种情况下,没有64行输出。(可能地址\u组件数组并不总是像您期望的那样长。)
您提供的URL返回JSON,因此您应该使用JSON解析器来处理数据。然后从中读取结果[0].geometry.viewport.soutwest.lat
值。(读取该属性的精确语法取决于您使用的JSON库。)纬度:=(xTemp.Strings[63]);你确定谷歌地图总是用这个代码返回64行或更多行吗?它有更多行,但我得到了第63行的位置,这是纬度坐标。它没有更多行。你报告的例外情况证明了这一点。您可以进行一些调试来调查它返回了多少行,但最终,所有关于行的讨论都是无关的,因为您正在处理JSON。你读了吗?现在我被困在了@Rob。我正在使用Delphi xe4。很抱歉,您被卡住了。我想我回答了你的问题。你被什么困住了?