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

Fedor K

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

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

  • Посещение

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

    17

Сообщения, опубликованные Fedor K

  1. 2 часа назад, x11 сказал:

    Может кому пригодится пример с использованием startForeground, а то в справке по Delphi не нашёл

    При работе с API конкретной платформы советую использовать именно справку самой платформы. Находим реализацию на родном языке и пытаемся повторить тоже самое через wrappers от Delphi.

    2 часа назад, x11 сказал:

    Не нашёл информации, почему именно 1 здесь:

    Self.JavaService.startForeground(1, notification);

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

  2. @Pavel M, Судя по вашей обертке класса и самой JAR:

    1.  Нужно удалить все не статические методы из описания интерфейса наследуемого от 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;
    2. У класса User нету конструктора по умолчанию, поэтому вызов такого кода вызовет ошибку:
      //неправильный вариант с ошибкой
      TestClass := TJUser.Create;
      
      //правильный вариант
      TestClass := TJUser.JavaClass.init(
          StringToJString('uuid'),
          StringToJString('secondName'),
          StringToJString('firstName'),
          StringToJString('phone'),
          StringToJString('pin'),
          StringToJString('roleUuid'),
          StringToJString('roleTitle')
         );

       

    3. Если к проекту подключаете любые JAR файлы, то следите, чтобы вместе с ними были подключены и все остальные .jar библиотеки с классами, на которые ссылаются исходники. Например, в Вашем примере при вызове вышеприведенного конструктора первым делом выскочит ошибка:

    image.png.b99efc947b37811334b140361f0d7bc7.png

    Вам нужно найти все такие подключения и найти сборки, в которых они валяются:

    image.png.5ad2aaec7da206c4ddcdb50273f732b2.png

    Если в проекте в Android Studio включено копирование всех сторонних библиотек в папку libs, то после компиляции всего преокта практически все либы можно найти:

    • папка libs;
    • output папке проекта;
    • папка Android SDK.

    п.с. Тему лучше перенести в раздел Android, так больше шансов получить помощь.

  3. @Akad, У Вас есть опыт работы с TNetHTTPClient компонентом или классом THTTPClient? Как и где вы это использовали? Что не понравилось? Какие трудности были?

    ... можете не отвечать, я уже глянул ваши предыдущие сообщения и смысла в продолжении беседы не вижу

    @kiz35196 Наиболее простой вариант Вы можете глянуть в этом посте.

  4. 2 часа назад, Akad сказал:

    TIdHTTP - попробуйте асинхронно что-то сделать. Только в потоке. Все другие indy - тоже самое. Остаются всякие страшные TcpClient1 которые из версии в версию то работаю то не работаю. Причём http - ручками. Ещё то удавольствие.
     

    Пожалуйста, внимательней прочтите тему, здесь идет речь про асинхронный THTTPClient, а не про Indy компоненты. Если в вашем приложении до сих пор используется Indy, то советую от него избавляться.

    2 часа назад, Akad сказал:

    Сейчас под всеми платформами, что мне известны продвигается синхронный метод+callback. Что диез под виндой, что RxJava/Retrofit под андроид и т.д. Если используете что-то не традиционное - ни каких проблем. Но зачем это советовать другим? Поддерживать стереотип, что программист дельфи - быдлокодер-неформал?
     

    Пожалуйста, будьте более культырными в своем общении, этот форум нацелен повысить уровень делфи программистов, а не унизить кого-то и пустить по плохому пути.

    THTTPClient успешно делает асинхронные запросы и синхронизирует callback для обработки, поэтому использовать его в синхронном режиме и добавлять свою реализацию асинхронности считаю лишними затаратами ресурсов.

  5. 4 часа назад, Akad сказал:

    С асинхронностью все печально. Ну то есть использовать можно, но отгрести всевозможных проблем на машинах пользователей тоже... Поэтому лучше отдельный поток и callback. Причём эта практика самая распространённая на всех платформах и api.

    Synchronize, а дальше делай что хочешь. В XE 10.x.x будут проблемы в некоторых случаях, но на более ранних всё работало отлично.
     

    Что конкретно печально в асинхронности клиента? На какой платформе? Если с примером - то вообще замечательно.

    п.с. Еще раз повторю, что нареканий со стороны работы асинхронности не было замечено в течении года в нагруженном мобильном приложении на обоих осях, Delphi Berlin Update 2.

     

  6. 15 минут назад, Akad сказал:

    (почти) все обращения к api потоко-независимы. А вот если одновременно из двух потоков сделать memo1.lines.add(..) то будет в лучшем случае бред в результате, в худшем - AV. 

    1. Тут была идея подчеркнуть, что используется именно асинхронность самого THTTPClient, а не постройка своего велосипеда. 

    2. Можете дать пример кода вашей записи memo1? Или вы имеете ввиду обращение к UI без синхронизации?

  7. Легче и быстрее всего сделать свой стиль(и) TListBoItem, который содержит нужные вам контроллы и затем чисто добавлять новый элемент списка. делать солянку с фреймами или TVertScrollBox требует лишних телодвижений.

  8. В 20.03.2018 в 11:41, krapotkin сказал:

    не надо ничего включать. сделаете только хуже код. выносите в отдельный поток. 

     

    1 час назад, ENERGY сказал:

    Лучше использовать потоки, т.к. сейчас все моб. девайсы имеют многоядерные процессоры.

    
    TThread.CreateAnonymousThread(
    ...

     

    
    TThread.CreateAnonymousThread(procedure ()
      begin
    ....

     

    Можете немного подробнее, с чем связано это? Чем стандартная реализация асинхронности не устраивает? Используем около года в довольно сильно нагруженном приложении для асинхронных вызовов API, нареканий не было, Delphi Berlin Update 2. Или сломали реализацию в Tokyo?

  9. В 01.03.2018 в 08:56, x11 сказал:

    https://blog.grijjy.com/2017/01/30/embed-facebook-sdk-for-android-in-your-delphi-mobile-app-part-2/

    Embed Facebook SDK for Android in your Delphi mobile app (Part 2)

    Вы наверняка меня не поняли, стоило использовать кавычки). Добавлять SDK можно, но это головная боль  с "напильником" в руках. Если вы считаете, что все классно - не стану переубеждать. На том же Xamarin подключить SDK займет пару минут. Пока не будет создано расширений для IDE и небольшого рефакторинга исходников -> использовать сторонние библиотеки будут вызывать негативные эмоции.

     

    14 часа назад, ENERGY сказал:

    @Fedor K

    По поводу процессоров Intel.

    1. На таких Android девайсах используется ARM эмулятор,  поэтому программы на Delphi там работают.

    2. Intel уже давно не выпускает мобильные процессоры.  

    1. Да, используется, но это очередной костыль, который не ахти сказывается на скорости работы. 

    2. Да, с 2016 года прекращен выпуск мобильных процессоров. Поэтому со временем этот пункт можно отметать.

     

    п.с. Давайте соберем список действительно невозможных на сегодняшний день вещей.

  10. 2 часа назад, Akad сказал:

    Проверил эту гипотезу. На предмет глюков  RAD Studio 10.1 Berlin Update 2 с TThread.Synchronize. Эта проблема меня больше всего волнует из всех под win, остальные я уже почти все обошёл так или иначе. Для чистоты эксперимента взял виртуальную машину, образ скаченный с сайта эмбы и всё. Ничего стороннего не ставилось.

    Результат печален.  Один и тот-же проект, под 10.2 стандартные падения в стандартных местах, где-то 1 раз из 4-х, может чуть реже. Берлин падает каждый раз при выходе, после использования синхронайза, плюс в процессе работы падения 1 из 3 или даже 1 из 2. В общем Токио ГОРАЗДО стабильнее работает с много поточностью.
     

    P.S. Запускалось естественно всё на одной машине, под одним пользователем.
     

    Проблем с синхронизацией не было замечено ранее и пуля прилетает скорее всего из другого места. Сделайте нам демку пожалуйста.

    1. CloseApplication.Terminate - я бы не советовал использовать на Android. Может оказаться такая ситуация, что часть приложения останется в памяти, а что-то уже убьется. В итоге заново запустить приложение без выкидывания из истории не получится и увидите только черный экран.
    2. Желательно обойтись без самоубийства на Android  и лишь свернуть через SharedActivity.moveTaskToBack(True);
    3. Если все же самоубийство по плану, тогда лучшие средства 
    • TJProcess.JavaClass.killProcess(TJProcess.JavaClass.myPid);
    • MainActvity.Finish; - как упомянул выше Равиль.

     

  11. 21 час назад, ENERGY сказал:

     

    1. Нет жесткой привязки, можно использовать последний SDK. Есть рекомендуемый SDK, с которым EMBT протестили студию.

    2. Абстракция это наоборот огромный плюс

    6. А что не так сейчас отладкой? Под Android медленно согласен, но она работает, под iOS вполне быстро. 

    7. Какие ограничения ARM?

    8. Не совсем понял в чем тут проблема для финального результата.

     

    1. Да, мы можем подключить новую версию SDK, но все обертки в исходниках остались старые. В итоге: поменял SDK -> заменил обертки -> наслаждаешься новыми "фичами" + количество оберток не резиновое.

    2. Абстракция огромный плюс, когда инструмент доведен до идеала. В данный момент имеет плохую оптимизацию работы самого FMX + подарки от разработчиков = "у меня лагает" или "это валится с ошибкой, такого быть не может, на винде работает" и т.д.

    6. Попробуйте отладку любого TJavaGenericImport класса, а потом возьмите этот же Java класс и посмотрите, что доступно при отладке в Android Studio.

    7. Поддерживаются только ARM процессоры, про Intel и другие забываем, а это очень влияет на авторитет твоего приложения.

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

    + к этому: Крайне не удобно поддерживать версионность, когда требуется замена картинок. Если хранить только относительный путь в ресурсы - это делается с легкостью.

    В 05.11.2017 в 20:03, Вольдемар сказал:

    Давайте в этой ветке соберем список невозможного (пока?) на Delphi для Android.

    1. Невозможно сделать widget 

    1. Сервисы тоже вряд ли можно назвать рабочими, но маркетологи с этим крайне не согласны. Поэтому согласно этому мы также можем запихнуть .jar классы widgetа в приложение и потом написать такую же оберку, как для сервисов и вызывать delphi код, но затраты не совместимы.

    2. "Невозможно" сделать провайдер клавиатуры для системы. 

    3. Невозможно скачать стороннее SDK и использовать в своем приложении. Для FMX их никто не делает и делать не собирается. Хотим Facebook SDK -> запаситесь терпения и сделайте все сами или делайте обходные пути.

  12. Очередные холивары из разряда "мои проблемы никто не хочет решить за меня, значит Delphi плохой инструмент, давайте все перейдем в другую песочницу...". Минусы FMX есть и будут, от этого никуда не денешься, но в последнее время весь soft и продукты катятся в яму с кучей bugs даже от крупных компаний и корпораций даже спустя многие releases. 

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

    Проблемы FMX  в следующем:

    1. Жесткая привязка к версии SDK, возможно сделано целенаправленно, чтобы пользователи обновляли лицензии год за годом.
    2. Позволяет разработчику не углубляться в особенности операционной системы, и не меняя мышления клепать свой "первоклассно рабочий VCL стиль" код и тонны компонентов под все платформы.
    3. Пропаганда "возьмите свой старый код и сделайте мобильное приложение" - маркетологи, вы в своем уме?
    4. Отсутствие достойных плагинов для IDE. Тот же Cn Wizard давно пора включить по дефолту. Неужели сложно добавить плагин для создания wrappers для java классов сразу в IDE? Разве сложно загрузить приложение прямо в маркет без ручного копирования?  Отсутствует редактор manifest, plist как таковой. Вспоминается анекдот про танк и "доработать напильником".
    5. Многие достойные вещи делаются на голом энтузиазме сообществом, но почему-то только спустя много-много времени внедряются в коробку.
    6. Отсутствует нормальный debug на мобильных платформах, логами все не покроешь.
    7. Ограничения в ARM процессорах.
    8. Желание все хранить в .fmx, .dfm файлах, а не ссылками в ресурсы, как это принято в мобильной разработке. Это конечно обходится написанием своих менеджеров, но неужели сложно это продумать из коробки? Такое чувство, что пытаемся охватить как можно больше платформ по чуть чуть, чтобы кому-нибудь впарить свой продукт, а уже потом будем думать, как выкручиваться.
    9. FMX Canvas - ахиллесова пята.

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

    FMX в последнее время активно развивается и спустя Х лет все будет у нас превосходно, просто не бегите за новыми версиями, а подождите Update 3 или используйте предыдущую версию (Berlin Update 2 все еще в соку).

    Другие кросплатформенные frameworks (Xamarin, Reac Native, RemObject, Native script, другие) тоже не лишены недостатков, но там слегка другие концепции и другая аудитория, кто лучше - покажет лишь время.

  13. Мне кажется вся проблема в том, что идет удаление объекты до окончания операций. Учитывайте, что процесс выполняется асинхронно:

        begin
          //тут лишь создается поток, в котором выполняется запрос
          lHttp.Post(Url, lSendData);
          Result := '';
        end;
        // Result := lResponse.StatusCode = 200;
      finally
        //вот здесь ошибка. Нельзя удалять объекты, если действие еще не завершилось. Вы можете узнать об завершении прцоессса в событии OnRequestCompleted
        lSendData.Free;
        lHttp.Free;
      end;

     

     

  14. В 17.11.2017 в 16:19, Wovan2 сказал:

    Посмотрел ваш пример, все зависания и вылеты с ошибками связаны с обращением к пустым объектам, попыткой обработать все в одном обработчике. Исправить клиент дело не благодарное, поэтому сделал пример по работе с TCP сокетом с возможностью автоподключения (тык). Проверил на нескольких устройствах, полет нормальный.

    Основные замечания:

    1. Не используйте FormActivate событие, тем более на мобильной платформе. Его обработка замораживает приложение. В примере посмотрите вариант обхода.
    2. TIniFile нет смысла использовать каждый раз для считывания настроек. 1 раз считали при старте приложения и больше к файлу не обращаемся.
    3. Хранить настройки в компонентах (edSettingHost.Text и т.п.). Создание свойства отнимет максимум минуту, а выгоду даст существенную.
    4. TCP сокет соединения следуют принимать как асинхронные, а не как запрос-ответ. Это предусматривает получение команды сервером, какое-то выполнение и лишь потом отправка на клиент. Поэтому попробуйте отказаться от использования GetFromServer.

    Сервер только запускал для проверки клиента, пару раз ловил outofmemory и access violation, закрыться тоже не захотел по-хорошему. Поэтому желательно его тоже довести до ума.

  15. 21 час назад, Wovan2 сказал:

    Никаких сообщений не появляется. Программа подвисает вместе с Адроидом, потом тупо окно закрывается. Молча. Таймауты на клиенте выставил ConnectTimeOut = 5000; ReadTimeOut = 5000;
    В общем вопрос. Как правильно организовать на Indy управление соединением? Чтобы не тормозило, Была возможность переподключиться. 

    PS. Почему-то в Delphi 10.2 не могу найти компонент AntiFreeze. ????

    Можете мне сделать тестовый сервер и клиент, чтобы я смог у себя проверить? Тогда мой ответ будет более детальным. А пока:

    1. Какой вы объем данных шлете по соединению?
    2. Чем вызвана потребность использовать именно сокеты?
    3. TimeOut  никогда не ставьте большими. Indy работает по принципу блокировки сокета и всего потока в целом. Поэтому большое значение = зависание всего приложения = нежелательные результаты и зависание. Я ставил 100 мс для работы с маленькими пакетами. С такой задержкой доп. поток не обязателен. Если значения более 500 мс - нужно создавать отдельный поток и работать с сокетами в ней + синхронизация при обработке / отправке данных.
    4. TIdTCPClient на Andoid любит спать и не проверять входящий буфер. Поэтому вручную нужно вызывать по таймеру проверку типа:
    5. 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, использование его плохая практика. На мобильной платформе вряд ли он появится, хотя и реализуется не сложно.

  16. Если я правильно понимаю, это запись значения в справочник. Для работы с этим хранилищем есть такой враппер:

    https://www.dropbox.com/s/5q17zki83t1ivjq/AppProperties.pas?dl=0

    Попробуйте сделать так:

    TAppProperties.SaveStr(['UserAgent'], ['My User Agent 1.0']);

     

  17. 23 часа назад, Rusland сказал:

    Из-за проблем с SSL... в маркет не пропускают

    Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и  (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь

    После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно. 

  18. В 08.11.2017 в 22:01, Fedor K сказал:

    Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.

    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);

     

  19. 5 часов назад, Rusland сказал:

    позволяет в XCode работать с самоподписанными сертификатами. Всего пару строк добавил и заработало :)

    Хотелось бы так же просто и в FMX... или переходить на XCode?  :)

    Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.

  20. 6 часов назад, munhauz сказал:

    в данной строке ошибка 

    
     JsA := TJSONObject.ParseJSONValue(JSO.GetValue('pipelines').ToString) as TJSONArray;

    не соответствие типов 

    Ошибка возникает из-за того, что элемент 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');

     

    6 часов назад, munhauz сказал:

    в JSON работаю впервые потому понимаю что ошибка может быть детская . если накидаете ссылки на хорошую литературу по тому как работать с JSON тоже буду благодарен 

    Это легкий формат, посмотрите используемые типы на любом ресурсе (случайная ссылка, еще одна случайная ссылка) и дальше просто смотрите примеры работы.

    В Delphi лучше использовать сторонние библиотеки для работы с этим форматом, т.к. они выигрывают в производительности и легче в использовании: x-superobjectJsonDataObjects, и др.

  21. В 06.10.2017 в 16:25, Rusland сказал:

     

    А как решить эту проблему для iOS?

    Думаю вполне реально. Пример обхода этой проблемы есть  ссылка #1 и ссылка #2. Методика следующая:

    1. Добавляем в .plist из комментария разрешения.
    2. Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата.
    3. Создаем экземпляр NSURLConnection и выполняем тот же запрос.
    4. В методе didReceiveAuthenticationChallenge доверяем сертификату.
    5. Выполняем загрузку страницы в webView заново.
    В 14.07.2017 в 11:10, jordi сказал:

    Hello! Sorry for not speaking russian...

    I've found this forum talking about an error in onReceivedSslError. Translating with google from russian to spanish, it seems that you've found a solution providing a new jar. I've tried fmx.jar from "FmxJarTest.zip" in Tokyo, but I get  segmentaion fault (11) when application starts. Is this code compatible with Tokyo? The other link in dropbox doesn't work.

    Thank you very much!

    Jordi

     

    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.

  22. Таким образом получал access_token лишь из Facebook, остальные приложения не требовались. Пример написан в далеком 2015 году, сейчас возможно нужны небольшие доработки. Насколько я помню, у приложения VK тоже была похожая активность для авторизации, как и у Facebook:

        FacebookAppName = 'com.facebook.katana';
        FacebookActivityName = 'com.facebook.katana.ProxyAuth';

    Схема следующая:

    1. Сканируем установленное приложение и находим активность для авторизации.
    2. Из своего приложения запускаем эту активность и передаем требуемые данные.
    3. Получаем ответ от приложения и вытаскиваем access_token.
    4. Делаем HTTP запрос к API и получаем требуемую информацию о пользователе.
  23. 2 часа назад, enatechno сказал:

    Потому что у t3 и t4 Owner - это form1:
     

    
     t3:=ttext.Create(form1);t3.Text:=floattostr(zap.razmer.kol);
     t4:=ttext.Create(form1);t4.Text:='X';

    а значит они не удаляются при удалении item. По логике должны быть r3 и r4 соответственно.
     

    
     t3:=ttext.Create(r3);
     t4:=ttext.Create(r4);

     

    Небольшое уточнение: они не удаляются только на мобильных платформах, т.к. идет вызов 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, чтобы уменьшить кол-во ссылок и путаницы.

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