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

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

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

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

  • Посещение

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

    100

Сообщения, опубликованные Евгений Корепов

  1. Ага, теперь нормально воспроизводится.

    Самый простой способ избежать этого, вот такой:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Memo1.Text:=EmptyStr;
      Memo1.ResetFocus;
      Memo1.SetFocus;
    end;

    Правда будет видно что виртуальная клавиатура исчезает, а затем опять появляется. 

  2. 50 минут назад, Martifan сказал:

    в контроле то есть когда удаляю 123 с помощью кнопки, контролер очищается, но когда хочу написать 456 автоматом впереди добавляется 123 и получается 123456

    Сделал тестовое приложение (чистый андроид 9, Rio), но не удалось воспроизвести такое поведение.

    Закиньте проект в котором глюк воспроизводится.

  3. 1 час назад, ivyl сказал:

    И сколько Вам платят за рекламу?

    У меня из 5 устройств ни одного Кся, но все Виндой прекрасно определяются.

    К сожалению нисколько. Тут просто здравый смысл - вы приобретаете телефон хорошего качества, с нормальной гарантией и сервисом. Программа Android One гарантирует вам обновления (ежемесячные обновления и обновления OS) - это значит что устройство сможет помогать вам в разработке не один год. В последствии вы сможете продать устройство за приемлемые деньги, а не за 300 рублей (как раз по такой цене я распродал мусор Dexp купленный изначально, 4 года назад, по неопытности). Вот и все аргументы, никакого скрытого умысла.

    P.S. Добавлю - один из телефонов Dexp взорвался у меня прямо на столе. Чудом не сгорел рабочий кабинет, но часть рабочих бумаг погорело, слава богу все само потухло. Меня на месте в этот момент не было, телефон был подключен к компу - до этого занимался отладкой одного из приложений. Телефон превратился в оплавленный комок пластмассы. ))

  4. 18 минут назад, Ingalime сказал:

    А не было ли у вас ситуации, что вы купили устройство с андроид, а вот подружить его со студией не удалось. Не видит его студия и все... 

    Если можно ваши конкретные модели (название/номер), что используються в вашем стенде при разработке под андроид в последней версии студии.

    Спасибо.

    Это происходит в основном или с русским ребрендингом, где пытаются скрыть настоящего производителя аппарата с помощью программный заглушек. Типа Dexp и прочий мусор. Или с контрафактной китайщиной без IMEI.

    Тут не студия не видит, а винда не понимает что к ней подключили. Обычно решается поиском на китайских форумах подходящих дров.

    Просто покупайте любой Xiaomi c Android One (чистый андроид). Его вы всегда сможете использовать по назначению для себя/семьи или продать. 

    Или покупайте любой, в нормальном магазине - если что то не заработает, вернете в течении двух недель со словами "Его цвет не походит к моим глазам" )))

     

  5. 16 минут назад, Tumaso сказал:

    Xiaomi  тоже скоро лишат доступа к экосистеме андроида, по примеру хуавея ?

    Это вряд ли. Да и по хуавею уже на попятную пошли, ибо без редкоземельных металлов, штатам придется вернутся к плантациям и  неграм-рабам. ))))

  6. Я бы переделал и код отправки и код приема.

    При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете 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];

     

  7. Покупайте любой телефон с андроидом посвежее (потому как в последней версии студии на андроиде < 5 вы ничего уже не запустите). 

    И обязательно берите чистый аднроид, никаких HTC, Samsung, Xiaomi с их мега-облочками.

    Вот к примеру Xiaomi A1 - модель с чистым андроидом, вполне себе средний телефон, не дорого.

  8. Одно из основных требований протокола REST - отсутствия состояния. Т.е. сервер ничего не должен хранить: запрос от клиента, ответ от сервера, все. Никаких сессий и прочей мути. 

    То что у вас на данный момент реализовано - велосипедный костыль, поэтому никакие стандартные фреймворки с этим работать не будут. 

    P.S. Прочитал ваше сообщение внимательнее - все верно у вас работает. 

    "НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod" - вот так и должно быть.

  9. Продукты Apple не умеют корректно декодировать URL. Это исключительно ваша задача. Все другие платформы делают это автоматически.

    Вам нужно добавить код:

    uses System.NetEncoding;
    ...
    URL:='http://blabla.com/php/pay2.php?eks=' + System.NetEncoding.TURLEncoding.URL.Encode('блабла&sum=100&hash=блабла&orderid=205');

     

  10. Я уже поднимал эту тему, поищите по AndroidTV, но тоже не смог побороть проблему. Проблема вроде именно в FMX, где то в исходниках даже видел некий массив "разрешенных" кнопок. Но занимался этим эпизодически, потом вообще забил. Если докопаетесь до истины - будет хорошо.

  11. Мимо проходил. Вот вам код на 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;

     

  12. 1 час назад, Tumaso сказал:

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

    Я пару лет назад работал с делфовской оберткой www.delphiffmpeg.com для ffmpeg, делал приложение для windows/mac os. Там все работает идеально, можно извращаться (в хорошем смысле этого слова) не только с изображениями, но и видео и аудио. Но поддержки linux в этой библиотеке (delphiffmpeg.com) нет до сих пор.

    Вообще сейчас пытаюсь адаптировать Vampyre Imaging Library для использования в Rio, эта текущая версия библиотеки во freepascal поддерживает Linux , а в делфи нет. Проблема в том, что разработчик использует собственный вариант ZLib, а также использует LongInt, у которого размерность на разных системах разная (в частности в 64-битном linux он 8ми байтовый).

     

    Можно просто вызывать как внешнее приложение с нужными параметрами. Я к примеру на сервере Asterisk на лету пережимаю wav в ogg таким образом - все работает превосходно. 

    Если не хотите использовать внешнее приложение, то у ffmpeg отличная документация, в том числе и по работе с вызовами функций из библиотек, так что дополнительная прокладка в виде компонента может и не понадобиться. В линуксе же можно подключать библиотеки so, по аналогии с windows dll ? Тут мои знания и опыт очень ограничены, но предполагаю что нет ничего не возможного )))

  13. 4 часа назад, Bob32 сказал:

    руки дошли только сегодня и то пока криво )

    файл нашел, скопировал в директорию проекта, и там отредактировал.

    но этот файл  IdGlobalProtocols.pas - это не в чистом виде модуль библиотеки Indi.

    Что значит "add the edited file to your project"? просто списать в каталог проекта - этого вероятно будет недостаточно )

    Просто закиньте в паку с проектом, этого думаю достаточно.

    P.S. для проверки напечатайте какую нибудь явную ересь в этом файле - если компилер ругнется на ошибку, значит он нужный файл подключает к проекту.

  14. 50 минут назад, Bob32 сказал:

    Стоял левый часовой пояс в настройках телефона. Поставил московский -время изменилось но, снова не в том часовом поясе. ;) 

    Сейчас показывает 7:27, а должно 13:27

    Какая версия среды у вас и какая версия Indy? Возможно проблема в старой версии Indy, погуглите "delphi indy OffsetFromUTC" - там были какие то проблемы, и вроде они исправлены.

    У меня вот такая версия (в Rio с последним апдейтом). Узнать версию - киньте любой компонент Indy на форму, правой кнопкой по компоненту и About. 

    image.png.809e6947de20e9528bfd9fdbcd8e82b7.png

    Повторюсь - на андроиде я не проверял правильность работы.

  15. 28 минут назад, Bob32 сказал:

    Стоял левый часовой пояс в настройках телефона. Поставил московский -время изменилось но, снова не в том часовом поясе. ;) 

    Сейчас показывает 7:27, а должно 13:27

    Посмотрите исходники модуля IdSNTP - там все достаточно просто (всего 300 строк кода). Может пошаговый дебаг поможет понять откуда берется ошибка. На винде у меня правильное время отдает, на андроиде не пробовал.

×
×
  • Создать...