Перейти к содержанию
Fire Monkey от А до Я

Евгений Корепов

Пользователи
  • Постов

    738
  • Зарегистрирован

  • Посещение

  • Победитель дней

    100

Весь контент Евгений Корепов

  1. Пытался понять как работает TClearEditButton у TEdit - она очищает клавиатуру нормально. Но понять и адаптировать к TMemo не смог ))))
  2. Нашел еще более изящный способ, без исчезновения/показа клавиатуры: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.SelectAll; Memo1.DeleteSelection; end;
  3. Ага, теперь нормально воспроизводится. Самый простой способ избежать этого, вот такой: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text:=EmptyStr; Memo1.ResetFocus; Memo1.SetFocus; end; Правда будет видно что виртуальная клавиатура исчезает, а затем опять появляется.
  4. Сделал тестовое приложение (чистый андроид 9, Rio), но не удалось воспроизвести такое поведение. Закиньте проект в котором глюк воспроизводится.
  5. Я использую для такого Indy, там все готовенькое, в том числе и TIdUDPServer со всем нужным вам функционалом (и потоками). Вот в теме немного обсуждения
  6. Не очень понятно где именно вы видите 123456, в самом контроле или в помощнике клавиатуры?
  7. К сожалению нисколько. Тут просто здравый смысл - вы приобретаете телефон хорошего качества, с нормальной гарантией и сервисом. Программа Android One гарантирует вам обновления (ежемесячные обновления и обновления OS) - это значит что устройство сможет помогать вам в разработке не один год. В последствии вы сможете продать устройство за приемлемые деньги, а не за 300 рублей (как раз по такой цене я распродал мусор Dexp купленный изначально, 4 года назад, по неопытности). Вот и все аргументы, никакого скрытого умысла. P.S. Добавлю - один из телефонов Dexp взорвался у меня прямо на столе. Чудом не сгорел рабочий кабинет, но часть рабочих бумаг погорело, слава богу все само потухло. Меня на месте в этот момент не было, телефон был подключен к компу - до этого занимался отладкой одного из приложений. Телефон превратился в оплавленный комок пластмассы. ))
  8. Это происходит в основном или с русским ребрендингом, где пытаются скрыть настоящего производителя аппарата с помощью программный заглушек. Типа Dexp и прочий мусор. Или с контрафактной китайщиной без IMEI. Тут не студия не видит, а винда не понимает что к ней подключили. Обычно решается поиском на китайских форумах подходящих дров. Просто покупайте любой Xiaomi c Android One (чистый андроид). Его вы всегда сможете использовать по назначению для себя/семьи или продать. Или покупайте любой, в нормальном магазине - если что то не заработает, вернете в течении двух недель со словами "Его цвет не походит к моим глазам" )))
  9. Это вряд ли. Да и по хуавею уже на попятную пошли, ибо без редкоземельных металлов, штатам придется вернутся к плантациям и неграм-рабам. ))))
  10. Я бы переделал и код отправки и код приема. При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете 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];
  11. Покупайте любой телефон с андроидом посвежее (потому как в последней версии студии на андроиде < 5 вы ничего уже не запустите). И обязательно берите чистый аднроид, никаких HTC, Samsung, Xiaomi с их мега-облочками. Вот к примеру Xiaomi A1 - модель с чистым андроидом, вполне себе средний телефон, не дорого.
  12. Одно из основных требований протокола REST - отсутствия состояния. Т.е. сервер ничего не должен хранить: запрос от клиента, ответ от сервера, все. Никаких сессий и прочей мути. То что у вас на данный момент реализовано - велосипедный костыль, поэтому никакие стандартные фреймворки с этим работать не будут. P.S. Прочитал ваше сообщение внимательнее - все верно у вас работает. "НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod" - вот так и должно быть.
  13. MultiView.IsShowed http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.MultiView.TCustomMultiView.IsShowed
  14. Продукты Apple не умеют корректно декодировать URL. Это исключительно ваша задача. Все другие платформы делают это автоматически. Вам нужно добавить код: uses System.NetEncoding; ... URL:='http://blabla.com/php/pay2.php?eks=' + System.NetEncoding.TURLEncoding.URL.Encode('блабла&sum=100&hash=блабла&orderid=205');
  15. Зайдите в Менеджер лицензий (в меню Help) и убедитесь что у вас активирована лицензия именно на "Delphi 10.3 Rio Professional with Mobile". Если нет, то повторная регистрация поможет.
  16. Я уже поднимал эту тему, поищите по AndroidTV, но тоже не смог побороть проблему. Проблема вроде именно в FMX, где то в исходниках даже видел некий массив "разрешенных" кнопок. Но занимался этим эпизодически, потом вообще забил. Если докопаетесь до истины - будет хорошо.
  17. Мимо проходил. Вот вам код на php (собираем все данные в один массив и энкодим в json) $QueryArray = array( "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", ); $Index = 0; $ResultArray = array(); foreach ($QueryArray as $query) { if ($mysqli_result = mysqli_query($DBLink, $query)) while ($row = mysqli_fetch_array($mysqli_result, MYSQLI_ASSOC)) $ResultArray[$Index][] = $row; $Index++; } $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); echo $ResultJSON;
  18. Можно просто вызывать как внешнее приложение с нужными параметрами. Я к примеру на сервере Asterisk на лету пережимаю wav в ogg таким образом - все работает превосходно. Если не хотите использовать внешнее приложение, то у ffmpeg отличная документация, в том числе и по работе с вызовами функций из библиотек, так что дополнительная прокладка в виде компонента может и не понадобиться. В линуксе же можно подключать библиотеки so, по аналогии с windows dll ? Тут мои знания и опыт очень ограничены, но предполагаю что нет ничего не возможного )))
  19. Как вариант - можете использовать внешнее приложение https://ffmpeg.org/ . И вроде можно использовать его библиотеки в своем приложении (но тут не скажу, не пробовал).
  20. Просто закиньте в паку с проектом, этого думаю достаточно. P.S. для проверки напечатайте какую нибудь явную ересь в этом файле - если компилер ругнется на ошибку, значит он нужный файл подключает к проекту.
  21. Какая версия среды у вас и какая версия Indy? Возможно проблема в старой версии Indy, погуглите "delphi indy OffsetFromUTC" - там были какие то проблемы, и вроде они исправлены. У меня вот такая версия (в Rio с последним апдейтом). Узнать версию - киньте любой компонент Indy на форму, правой кнопкой по компоненту и About. Повторюсь - на андроиде я не проверял правильность работы.
  22. Посмотрите исходники модуля IdSNTP - там все достаточно просто (всего 300 строк кода). Может пошаговый дебаг поможет понять откуда берется ошибка. На винде у меня правильное время отдает, на андроиде не пробовал.
  23. Я приводил вам пример работы скроллинга, а не спецификацию.
×
×
  • Создать...