function GetCode(const url: AnsiString): Cardinal; var VResponseCode: Cardinal; VResponseHeader, VResponseData: AnsiString; begin Result := 1; if Assigned(Downloader) then begin VResponseHeader := ''; VResponseData := ''; VResponseCode := Downloader.DoHttpRequest(url, '', '', VResponseHeader, VResponseData); Result := VResponseCode; end; end; var BaseUrl: string; code: Cardinal; z_ok, z_no: integer; r: integer; begin ResultURL := ''; z_ok := StrToIntDef(GetBefore(';', ScriptBuffer), 1); // Максимальный масштаб, который точно есть z_no := StrToIntDef(GetAfter(';', ScriptBuffer), 25); // Минимальный масштаб, которого точно нет // Масштаба нет - говорить не о чем if getz >= z_no then exit; // Выбор зеркала r := random(3); case r of 0: BaseUrl := GetURLBase; 1: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 'maps.melda.ru'); 2: BaseUrl := RegExprReplaceMatchSubStr(GetURLBase, '91.237.82.95:8088', 't.caucasia.ru'); end; // Проверяем наличие масштаба if getz > z_ok then begin code := GetCode(BaseUrl+'z'+inttostr(getz)+'/'); // Внимание! Если сервер вернёт 403 - code почему-то будет 0. Так что выбор "404 или что-то иное" // Если дело дошло до проверки наличия масштаба - значит какая-то граница (z_ok / z_no) точно подвинется. if code = 404 then z_no := getz else z_ok := getz; // Сохраняем актуализированные границы для последующих вызовов ScriptBuffer := inttostr(z_ok) + ';' + inttostr(z_no); // Масштаба нет (о чём могли только что при проверке узнать) - говорить не о чем if getz >= z_no then exit; end; // Ок, качаем тайлик ResultURL:= BaseUrl+'z'+inttostr(getz)+'/'+inttostr(getx div 1024)+'/x'+inttostr(getx)+'/'+inttostr(gety div 1024)+'/y'+inttostr(gety)+'.jpg'; end.