2017-01-27 5 views
-2

У меня есть база данных клиентов, которую я хочу проверить на googlemaps, и если найдено координата, то обновляется широта поля.Delphi Список указателей за пределами границ

Мой код ниже, но я выполняю его, возвращает мне список ошибок индекса за пределами. Я попытался создать цикл, но что-то не так.

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

широта: = (xTemp.Strings [63]); Вы уверены, что google maps * always * возвращает 64 или более строк с этим кодом? – Dsm

+0

у него больше строк, но я получаю позицию линии 63, которая предназначена для координат широты. –

+1

It * не имеет больше линий. Об этом свидетельствует ваше исключение. Вы можете выполнить некоторую отладку, чтобы исследовать, сколько строк оно возвращает *, но в конечном итоге все эти разговоры о * строках * не имеют значения, потому что вы имеете дело с JSON. –

ответ

0

Вы жестко закодированы индекс строки вы читаете:

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

Я не вижу никаких оснований для Вас, чтобы предположить, что 64-я строка будет содержать широту, ни то, что там всегда быть не менее 64 строк. Исключение, которое вы получаете, указывает, что по крайней мере в одном случае не 64 строки вывода. (Возможно, address_components массив не всегда до тех пор, как вы ожидаете, что это будет.)

URL, вы обеспечиваете возвращает JSON, так что вы должны сделать, это использовать JSON парсер для обработки данных. Затем прочтите значение results[0].geometry.viewport.southwest.lat. (Точный синтаксис для чтения этого свойства зависит от используемой библиотеки JSON.)

+0

Теперь я застрял @ Rob. Я использую Delphi xe4. –

+0

Мне жаль, что ты застрял. Я думал, что ответил на ваш вопрос. С чем вы застряли? –

0

Вы должны проверить длину TStringList переменной xTemp, прежде чем пытаться получить доступ конкретного пункта.

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

Вы также должны использовать try/finally блок для StringList:

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

Это позволит избежать утечек памяти, если что-то должно произойти из обычных.