Лидеры
Популярный контент
Показан контент с высокой репутацией 06.06.2019 в Сообщения
-
Узнать размер видеопамяти
Mars M и ещё один отреагировал Vladimir PRO за вопрос
Обновлённая ссылка на DEMO: http://gofile.me/2Zesj/fbsharing-C0f3wb1o Последняя версия в папке: OpenCL_Demo2018 Barrier and Local_Memory REDUCT Delphi Tokyo 10.2.2 !! LAST !!2 балла -
Версия андроид
Ingalime и ещё один отреагировал Евгений Корепов за вопрос
Покупайте любой телефон с андроидом посвежее (потому как в последней версии студии на андроиде < 5 вы ничего уже не запустите). И обязательно берите чистый аднроид, никаких HTC, Samsung, Xiaomi с их мега-облочками. Вот к примеру Xiaomi A1 - модель с чистым андроидом, вполне себе средний телефон, не дорого.2 балла -
Никто ведь не собирается удаленно у нескольких миллионов пользователей выпиливать ОС со всеми личными данными. Даже если и сольют, на существующих устройствах все еще можно разрабатывать и тестировать под Андроид 6, 7, 8, 9 Но новые функции очевидно не протестировать, да. Хотя о чем мы, эмба и новые функции - понятия полярные)))1 балл
-
Передача и прием JSON в PHP
mazayhin отреагировал Евгений Корепов за вопрос
Я бы переделал и код отправки и код приема. При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете json в лист. Отправка любым способом желательна в виде "Ключ=Значение", чтоб на стороне сервера корректно распознать данные. Вот отправка POST (добавьте в uses System.Net.Mime): function TForm1.PostURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; ASource: TMultipartFormData; begin result:= ''; AHTTPClient:= THTTPClient.Create; ASource:=TMultipartFormData.Create(); ASource.AddField('request', json); try try AHttpResponse := AHTTPClient.Post(aurl, ASource); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(ASource); FreeAndNil(AHTTPClient); end; end; Но гораздо проще и быстрее делать GET (добавьте в uses System.NetEncoding): function TForm1.GetURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; AEncodedJSON : String; begin result:= ''; AHTTPClient:= THTTPClient.Create; AEncodedJSON:=System.NetEncoding.TURLEncoding.URL.Encode(json); try try AHttpResponse := AHTTPClient.Get(aurl + '?request=' + AEncodedJSON); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(AHTTPClient); end; end; file_get_contents("php://input", "r") - это тоже вариант, но никогда такое не используйте. На стороне сервера, в php есть специальные глобальные переменные для получения данных $_REQUEST, $_POST и $_GET. $_POST и $_GET - для соответствующих HTTP методов. $_REQUEST - универсальный. Вот вам код php для сервера, я там описал вспомогательную функцию лога MyLog, измените путь логов на свой. <?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); function MyLog($Title, $Value = "", $Debug = false) { $LogFile = "/var/log/service/test001.log"; if (is_array($Title)) $Title = "\n".print_r($Title, true)."\n"; if (is_array($Value)) $Value = "\n".print_r($Value, true)."\n"; $Message = date("Y.m.d H:i:s")." ".$Title.$Value."\r\n"; if ($Debug) echo $Message; file_put_contents($LogFile, $Message, FILE_APPEND); } // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } MyLog('*************************************************************************************************************************'); MyLog('$_REQUEST:', $_REQUEST); MyLog('$_POST:', $_POST); MyLog('$_GET:', $_GET); MyLog('$RequesrArray:', $RequesrArray); // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0]; Обратите внимание json_decode($_REQUEST["request"], true); используется с вторым параметром true - при этом создается не объект (медленно), а ассоциативный массив (быстрее некуда). Вот код Delphi procedure TForm1.FormCreate(Sender: TObject); Var AURL : String; AJSON : String; begin AURL:='http://myserver.ru/api/test001.php'; AJSON:='{"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]}'; PostURL(AURL, AJSON); GetURL(AURL, AJSON); end; А вот логи на стороне сервера: 2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_GET: Array ( ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) 2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( ) 2019.06.06 13:29:13 $_GET: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) Как видите можно использовать код с $_REQUEST в обоих случаях. Вот итоговый код php <?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0];1 балл -
Причиной оказалось, что в Deploy убирал галочки с PNG иконок Android_Launcher1 балл
-
TMultiView состояние
Ingalime отреагировал Евгений Корепов за вопрос
MultiView.IsShowed http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.MultiView.TCustomMultiView.IsShowed1 балл -
Вместе с этим окном еще выдается и диалоговое окно с детализацией ошибки. Рекомендации, указанные на скриншоте, проверены? Свободное место на телефоне есть? Еще перед заливкой новой версии можно вручную удалить с телефона ранее установленную версию приложения1 балл
-
Проверить существование TJSONObject
Евгений Корепов отреагировал x11 за вопрос
В общем, да. Я изначально просто был не прав. Вот так правильно: var JSONValue: TJSONValue; innerObject: TJSONObject; begin ... .... JSONValue := TJSONObject.ParseJSONValue(.....); if not (JSONValue is TJSONObject) then Continue else innerObject := JSONValue as TJSONObject;1 балл