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

Fedor K

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

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

  • Посещение

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

    17

Весь контент Fedor K

  1. При работе с API конкретной платформы советую использовать именно справку самой платформы. Находим реализацию на родном языке и пытаемся повторить тоже самое через wrappers от Delphi. 1 - это идентификатор вашего сервиса отличный от 0 (см. подробнее Service | Android Developers), т.е. можете использовать любые положительные цифры. По сути и обычные уведомления тоже содержат такой идентификатор, но это практически редко используется.
  2. Fedor K

    JAVA и Delphi

    @Pavel M, Судя по вашей обертке класса и самой JAR: Нужно удалить все не статические методы из описания интерфейса наследуемого от JObjectClass: JUserClass = interface(JObjectClass) ['{A4B29440-8C8B-4C1F-A8E7-B7612D4FEEB4}'] function init(uuid : JString; secondName : JString; firstName : JString; inn : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; function init(uuid : JString; secondName : JString; firstName : JString; phone : JString; pin : JString; roleUuid : JString; roleTitle : JString) : JUser; cdecl; overload; end; У класса User нету конструктора по умолчанию, поэтому вызов такого кода вызовет ошибку: //неправильный вариант с ошибкой TestClass := TJUser.Create; //правильный вариант TestClass := TJUser.JavaClass.init( StringToJString('uuid'), StringToJString('secondName'), StringToJString('firstName'), StringToJString('phone'), StringToJString('pin'), StringToJString('roleUuid'), StringToJString('roleTitle') ); Если к проекту подключаете любые JAR файлы, то следите, чтобы вместе с ними были подключены и все остальные .jar библиотеки с классами, на которые ссылаются исходники. Например, в Вашем примере при вызове вышеприведенного конструктора первым делом выскочит ошибка: Вам нужно найти все такие подключения и найти сборки, в которых они валяются: Если в проекте в Android Studio включено копирование всех сторонних библиотек в папку libs, то после компиляции всего преокта практически все либы можно найти: папка libs; output папке проекта; папка Android SDK. п.с. Тему лучше перенести в раздел Android, так больше шансов получить помощь.
  3. @Akad, У Вас есть опыт работы с TNetHTTPClient компонентом или классом THTTPClient? Как и где вы это использовали? Что не понравилось? Какие трудности были? ... можете не отвечать, я уже глянул ваши предыдущие сообщения и смысла в продолжении беседы не вижу @kiz35196 Наиболее простой вариант Вы можете глянуть в этом посте.
  4. Пожалуйста, внимательней прочтите тему, здесь идет речь про асинхронный THTTPClient, а не про Indy компоненты. Если в вашем приложении до сих пор используется Indy, то советую от него избавляться. Пожалуйста, будьте более культырными в своем общении, этот форум нацелен повысить уровень делфи программистов, а не унизить кого-то и пустить по плохому пути. THTTPClient успешно делает асинхронные запросы и синхронизирует callback для обработки, поэтому использовать его в синхронном режиме и добавлять свою реализацию асинхронности считаю лишними затаратами ресурсов.
  5. Что конкретно печально в асинхронности клиента? На какой платформе? Если с примером - то вообще замечательно. п.с. Еще раз повторю, что нареканий со стороны работы асинхронности не было замечено в течении года в нагруженном мобильном приложении на обоих осях, Delphi Berlin Update 2.
  6. 1. Тут была идея подчеркнуть, что используется именно асинхронность самого THTTPClient, а не постройка своего велосипеда. 2. Можете дать пример кода вашей записи memo1? Или вы имеете ввиду обращение к UI без синхронизации?
  7. Легче и быстрее всего сделать свой стиль(и) TListBoItem, который содержит нужные вам контроллы и затем чисто добавлять новый элемент списка. делать солянку с фреймами или TVertScrollBox требует лишних телодвижений.
  8. Можете немного подробнее, с чем связано это? Чем стандартная реализация асинхронности не устраивает? Используем около года в довольно сильно нагруженном приложении для асинхронных вызовов API, нареканий не было, Delphi Berlin Update 2. Или сломали реализацию в Tokyo?
  9. Вы наверняка меня не поняли, стоило использовать кавычки). Добавлять SDK можно, но это головная боль с "напильником" в руках. Если вы считаете, что все классно - не стану переубеждать. На том же Xamarin подключить SDK займет пару минут. Пока не будет создано расширений для IDE и небольшого рефакторинга исходников -> использовать сторонние библиотеки будут вызывать негативные эмоции. 1. Да, используется, но это очередной костыль, который не ахти сказывается на скорости работы. 2. Да, с 2016 года прекращен выпуск мобильных процессоров. Поэтому со временем этот пункт можно отметать. п.с. Давайте соберем список действительно невозможных на сегодняшний день вещей.
  10. Проблем с синхронизацией не было замечено ранее и пуля прилетает скорее всего из другого места. Сделайте нам демку пожалуйста.
  11. Какая версия IDE? И сделайте пожалуйста демку для быстрой проверки.
  12. Close, Application.Terminate - я бы не советовал использовать на Android. Может оказаться такая ситуация, что часть приложения останется в памяти, а что-то уже убьется. В итоге заново запустить приложение без выкидывания из истории не получится и увидите только черный экран. Желательно обойтись без самоубийства на Android и лишь свернуть через SharedActivity.moveTaskToBack(True); Если все же самоубийство по плану, тогда лучшие средства TJProcess.JavaClass.killProcess(TJProcess.JavaClass.myPid); MainActvity.Finish; - как упомянул выше Равиль.
  13. 1. Да, мы можем подключить новую версию SDK, но все обертки в исходниках остались старые. В итоге: поменял SDK -> заменил обертки -> наслаждаешься новыми "фичами" + количество оберток не резиновое. 2. Абстракция огромный плюс, когда инструмент доведен до идеала. В данный момент имеет плохую оптимизацию работы самого FMX + подарки от разработчиков = "у меня лагает" или "это валится с ошибкой, такого быть не может, на винде работает" и т.д. 6. Попробуйте отладку любого TJavaGenericImport класса, а потом возьмите этот же Java класс и посмотрите, что доступно при отладке в Android Studio. 7. Поддерживаются только ARM процессоры, про Intel и другие забываем, а это очень влияет на авторитет твоего приложения. 8. Проблема в скорости работы. Если все картинки хранятся в бинарном виде на самой форме -> значит при ее создании затрачивается больше времени и она уже в памяти, даже если эту иконку вы никогда не отобразите пользователю. + к этому: Крайне не удобно поддерживать версионность, когда требуется замена картинок. Если хранить только относительный путь в ресурсы - это делается с легкостью. 1. Сервисы тоже вряд ли можно назвать рабочими, но маркетологи с этим крайне не согласны. Поэтому согласно этому мы также можем запихнуть .jar классы widgetа в приложение и потом написать такую же оберку, как для сервисов и вызывать delphi код, но затраты не совместимы. 2. "Невозможно" сделать провайдер клавиатуры для системы. 3. Невозможно скачать стороннее SDK и использовать в своем приложении. Для FMX их никто не делает и делать не собирается. Хотим Facebook SDK -> запаситесь терпения и сделайте все сами или делайте обходные пути.
  14. Очередные холивары из разряда "мои проблемы никто не хочет решить за меня, значит Delphi плохой инструмент, давайте все перейдем в другую песочницу...". Минусы FMX есть и будут, от этого никуда не денешься, но в последнее время весь soft и продукты катятся в яму с кучей bugs даже от крупных компаний и корпораций даже спустя многие releases. Если на то пошло, то предлагаю все "невозможные" фишки периодически добавлять в первый пост и прикреплять решения, если они существуют. Проблемы FMX в следующем: Жесткая привязка к версии SDK, возможно сделано целенаправленно, чтобы пользователи обновляли лицензии год за годом. Позволяет разработчику не углубляться в особенности операционной системы, и не меняя мышления клепать свой "первоклассно рабочий VCL стиль" код и тонны компонентов под все платформы. Пропаганда "возьмите свой старый код и сделайте мобильное приложение" - маркетологи, вы в своем уме? Отсутствие достойных плагинов для IDE. Тот же Cn Wizard давно пора включить по дефолту. Неужели сложно добавить плагин для создания wrappers для java классов сразу в IDE? Разве сложно загрузить приложение прямо в маркет без ручного копирования? Отсутствует редактор manifest, plist как таковой. Вспоминается анекдот про танк и "доработать напильником". Многие достойные вещи делаются на голом энтузиазме сообществом, но почему-то только спустя много-много времени внедряются в коробку. Отсутствует нормальный debug на мобильных платформах, логами все не покроешь. Ограничения в ARM процессорах. Желание все хранить в .fmx, .dfm файлах, а не ссылками в ресурсы, как это принято в мобильной разработке. Это конечно обходится написанием своих менеджеров, но неужели сложно это продумать из коробки? Такое чувство, что пытаемся охватить как можно больше платформ по чуть чуть, чтобы кому-нибудь впарить свой продукт, а уже потом будем думать, как выкручиваться. FMX Canvas - ахиллесова пята. Не смотря на все это FMX является очень мощным инструментом и крайне приятным в умелых руках, если вы любите напильник (или мазохист). Средне статические проекты можно реализовывать не боясь, но для более серьезных вещей понадобятся знания нативной разработки, без этого никак. Если заказчик начинает разговор "я хочу такое, как в том-то приложении..." - значит без написания своей обертки или исправления исходников не обойдешься. FMX в последнее время активно развивается и спустя Х лет все будет у нас превосходно, просто не бегите за новыми версиями, а подождите Update 3 или используйте предыдущую версию (Berlin Update 2 все еще в соку). Другие кросплатформенные frameworks (Xamarin, Reac Native, RemObject, Native script, другие) тоже не лишены недостатков, но там слегка другие концепции и другая аудитория, кто лучше - покажет лишь время.
  15. Мне кажется вся проблема в том, что идет удаление объекты до окончания операций. Учитывайте, что процесс выполняется асинхронно: begin //тут лишь создается поток, в котором выполняется запрос lHttp.Post(Url, lSendData); Result := ''; end; // Result := lResponse.StatusCode = 200; finally //вот здесь ошибка. Нельзя удалять объекты, если действие еще не завершилось. Вы можете узнать об завершении прцоессса в событии OnRequestCompleted lSendData.Free; lHttp.Free; end;
  16. Посмотрел ваш пример, все зависания и вылеты с ошибками связаны с обращением к пустым объектам, попыткой обработать все в одном обработчике. Исправить клиент дело не благодарное, поэтому сделал пример по работе с TCP сокетом с возможностью автоподключения (тык). Проверил на нескольких устройствах, полет нормальный. Основные замечания: Не используйте FormActivate событие, тем более на мобильной платформе. Его обработка замораживает приложение. В примере посмотрите вариант обхода. TIniFile нет смысла использовать каждый раз для считывания настроек. 1 раз считали при старте приложения и больше к файлу не обращаемся. Хранить настройки в компонентах (edSettingHost.Text и т.п.). Создание свойства отнимет максимум минуту, а выгоду даст существенную. TCP сокет соединения следуют принимать как асинхронные, а не как запрос-ответ. Это предусматривает получение команды сервером, какое-то выполнение и лишь потом отправка на клиент. Поэтому попробуйте отказаться от использования GetFromServer. Сервер только запускал для проверки клиента, пару раз ловил outofmemory и access violation, закрыться тоже не захотел по-хорошему. Поэтому желательно его тоже довести до ума.
  17. Можете мне сделать тестовый сервер и клиент, чтобы я смог у себя проверить? Тогда мой ответ будет более детальным. А пока: Какой вы объем данных шлете по соединению? Чем вызвана потребность использовать именно сокеты? TimeOut никогда не ставьте большими. Indy работает по принципу блокировки сокета и всего потока в целом. Поэтому большое значение = зависание всего приложения = нежелательные результаты и зависание. Я ставил 100 мс для работы с маленькими пакетами. С такой задержкой доп. поток не обязателен. Если значения более 500 мс - нужно создавать отдельный поток и работать с сокетами в ней + синхронизация при обработке / отправке данных. TIdTCPClient на Andoid любит спать и не проверять входящий буфер. Поэтому вручную нужно вызывать по таймеру проверку типа: procedure T<какое-то имя класа>.Read; var sz : integer; lMsg : string; begin try TMonitor.Enter(Self); try if not Assigned(Client.IOHandler) then Exit; //Client = TIdTCPClient if Client.IOHandler.InputBufferIsEmpty then begin if not Client.IOHandler.CheckForDataOnSource() then exit; end; sz := Client.IOHandler.InputBuffer.Size; if sz <= 0 then exit; lMsg := Client.IOHandler.InputBuffer.ExtractToString(-1, IndyTextEncoding_UTF8); Client.IOHandler.InputBuffer.Clear; <какой-то обработчик входящего сообщения>; except on e : Exception do <какой-то обработчик ошибки>; end; finally TMonitor.Exit(Self); end; end; AntiFreeze - это мягко говоря "костыль" от Indy, использование его плохая практика. На мобильной платформе вряд ли он появится, хотя и реализуется не сложно.
  18. Если я правильно понимаю, это запись значения в справочник. Для работы с этим хранилищем есть такой враппер: https://www.dropbox.com/s/5q17zki83t1ivjq/AppProperties.pas?dl=0 Попробуйте сделать так: TAppProperties.SaveStr(['UserAgent'], ['My User Agent 1.0']);
  19. Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь. После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно.
  20. Objective-C конечно весьма специфический... Попробовал несколько методов, но решение действительно очень простое: 1. Меняем iOSapi.Foundation.pas: unit iOSapi.Foundation; //~3855 строка, добавляем 2 метода NSURLRequestClass = interface(NSObjectClass) ['{A93A4D14-529E-41F0-86EC-B570715512BB}'] {class} function requestWithURL(URL: NSURL): Pointer; cdecl; overload; {class} function requestWithURL(URL: NSURL; cachePolicy: NSURLRequestCachePolicy; timeoutInterval: NSTimeInterval): Pointer; cdecl; overload; //метод раз {class} function allowsAnyHTTPSCertificateForHost(host: NSString): Boolean; cdecl; overload; //метод два {class} procedure setAllowsAnyHTTPSCertificate(allow: Boolean; forHost: NSString); cdecl; overload; end; 2. В своем коде для требуемых сайтов пишем следующее: TNSURLRequest.OCClass.setAllowsAnyHTTPSCertificate(true, StrToNSStr(<требуемый сайт>)); Проверял на сайте expired.badssl.com, XCode 7 + SDK 9.3, Simulator, также на реальном устройстве с iOS 11. п.с. Если нужно доверять абсолютно всем сайтам, думаю можно п. 2 вставить в FMX.WebBrowser.Cocoa.pas в методе: procedure TCommonWebBrowserService.DoNavigate(const URL: string);
  21. Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.
  22. Ошибка возникает из-за того, что элемент pipelines является TJSONObject (фигурные скобки «{ }»), а не TJSONArray (квадратные скобки «[ ]»). Как я понял из вашего примера, обращаться к id значению не требуется, т.к. элементы объекта pipelines являются исходными номерами. Для этого можно использовать следующий код: function GetIds(const AIn, APath: string): TArray<Integer>; var jIn, jIds: TJSONObject; jEnum: TJSONPairEnumerator; lCount, i: Integer; begin Result := []; jIn := TJSONObject.ParseJSONValue(AIn) as TJSONObject; if not (Assigned(jIn) and jIn.TryGetValue<TJSONObject>(APath, jIds)) then Exit; lCount := jIds.Count; SetLength(Result, lCount); for i := 0 to lCount - 1 do Result[i] := jIds.Pairs[i].JsonString.GetValue<Integer>('', -1); end; //вызывать так: GetIds(<json string>, 'response.pipelines'); Это легкий формат, посмотрите используемые типы на любом ресурсе (случайная ссылка, еще одна случайная ссылка) и дальше просто смотрите примеры работы. В Delphi лучше использовать сторонние библиотеки для работы с этим форматом, т.к. они выигрывают в производительности и легче в использовании: x-superobject, JsonDataObjects, и др.
  23. Думаю вполне реально. Пример обхода этой проблемы есть ссылка #1 и ссылка #2. Методика следующая: Добавляем в .plist из комментария разрешения. Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата. Создаем экземпляр NSURLConnection и выполняем тот же запрос. В методе didReceiveAuthenticationChallenge доверяем сертификату. Выполняем загрузку страницы в webView заново. Is the issue still actual? If yes, please send to me the fmx.jar file (by default path: "C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release"). Thanks.
  24. Таким образом получал access_token лишь из Facebook, остальные приложения не требовались. Пример написан в далеком 2015 году, сейчас возможно нужны небольшие доработки. Насколько я помню, у приложения VK тоже была похожая активность для авторизации, как и у Facebook: FacebookAppName = 'com.facebook.katana'; FacebookActivityName = 'com.facebook.katana.ProxyAuth'; Схема следующая: Сканируем установленное приложение и находим активность для авторизации. Из своего приложения запускаем эту активность и передаем требуемые данные. Получаем ответ от приложения и вытаскиваем access_token. Делаем HTTP запрос к API и получаем требуемую информацию о пользователе.
  25. Небольшое уточнение: они не удаляются только на мобильных платформах, т.к. идет вызов DisposeOf: //смотрим код в unit FMX.Types; procedure TFmxObject.DoDeleteChildren; ... Child := FChildren[I]; FChildren.Delete(I); Child.FParent := nil; Child.SetRoot(nil); Child.DisposeOf; // вот причина ошибки с именем на мобильных платформ, удалене контрола идет не сразу, а при обнулении ссылок ... Для RunTime компонентов лучше в качестве Owner указывать nil и задавать лишь Parent, чтобы уменьшить кол-во ссылок и путаницы.
×
×
  • Создать...