德尔福超出界限的索引列表

时间:2017-01-27 14:46:52

标签: json google-maps delphi

我有客户数据库,我想在googlemaps上查看,如果找到coordenate,则更新字段纬度。

我的代码在下面但我执行它会返回一个索引超出范围的错误列表。我试图创建一个循环,但有些东西是不正确的。

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;

2 个答案:

答案 0 :(得分:0)

在尝试访问特定项目之前,您需要检查TStringList变量xTemp的长度。

if xTemp.Count >= 64 then
  // Do something with xTemp[63]
else
  raise SomeError

您还应该使用try/finally块作为字符串列表:

 xTemp:= TStringList.Create;
 try
   ...
 finally
   xTemp.Free;
 end;

如果出现异常情况,这将避免内存泄漏。

答案 1 :(得分:0)

您已经对您阅读的行的索引进行了硬编码:

latitude := (xTemp.Strings[63]);

我认为没有理由认为第64行将保持纬度,也不会总是 至少64行输出。您获得的异常表示至少在一种情况下,不是 64行输出。 (也许address_components数组并不总是像你期望的那样长。)

您提供的URL返回JSON,因此您应该做的是使用JSON解析器来处理数据。然后从中读取results[0].geometry.viewport.southwest.lat值。 (读取该属性的确切语法取决于您使用的JSON库。)