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。很抱歉,您被卡住了。我想我回答了你的问题。你被什么困住了?