Конференция "Прочее" » Delphi и Android
 
  • Кто б сомневался © (23.05.17 01:21) [20]

    > А в больших приложениях с кучей форм программа вылетает(


    Ну а причем тут Delphi?
    Это просто ваша криворукость. Android закрывает программы если недостаточно памяти или программа отжирает много. iOS еще строже в этом плане.
    Это не Windows с его бесконечным свопом. Нужно переучиваться кодить с десктоп стиля "а создам как я все сразу при старте", на мобильный где ресурсов мало.

    Формы нужно создавать тогда, когда они нужны, а затем уничтожать.
    У меня на проекте, над которым сейчас работаю уже 11 форм. И работает, даже на древнем Ice Cream 4.0.1 без тормозов.

    Никаких ограничений нет на кол. экранов\форм, просто их нужно в нужное время создавать, и затем по возможности уничтожать.

    И вообще, что значит вылетает, запустите под отладчиком.

    Еще народ бывает понапихает в один ListBox Item всего разного (который на деле ScrollBar с визуальными компонентами), и создают потом по 100 Items и удивляются что ж тормозит то (для этого есть ListView с DynamicApearance ).
  • Кто б сомневался © (23.05.17 01:37) [21]
    И кстати имитировать модальное окно-диалог проще так (конечно он будет вызываться через Show, т.к. на Android все окна должны быть асинхронные):
    Прозрачная форма - transparent (+ установить цвет с альфаканалом), на нее TPanel - Align = VertCenter или Timage с png с альфаканалом или просто выставить Opacity, на нее Tlayout - HorzCenter, все что на Layout будет отцентрировано посередине экрана .

    Форма будет поверх других, причем полупрозрачно закрывая формы на заднем фоне.
    Я еще добавляю спецэффект - плавный переход от прозрачного к непрозрачному, слегка затемняя фон:

    frmDial.Fill.Color := TColorRec.Null;
    frmDial.Show;
    Application.ProcessMessages;
    TAnimator.AnimateColor(frmDial, 'Fill.Color', FADE_OUT_COLOR, 0.3);
  • Eraser © (23.05.17 02:13) [22]

    > Кто б сомневался ©

    как у знатока FMX спрашиваю, чем плох Tokio для андроид и в каких именно ситуациях плох? решаю тут, стоит ли переходить на новую версию или подождать с подпиской.
  • Кто б сомневался © (23.05.17 03:11) [23]
    Плох тем, что он там фактически не работает, а именно сильно тормозит и часть функционала потеряна - не работают эффекты, проблемы с анимацией, все порушилось.

    Раньше был основной Android GUI поток и Delphi main поток.
    Они решили перенести Delphi главный поток в Android поток, как в Delphi IOS кстати сделано, и недотестировали, и началась неуправляемая цепная багореакция, деления тяжёлых багов полученными при делении багов в предыдущем поколении, уход элементов за пределы объёма кода, поддерживающего цепной процесс, что приводит юзеров к энерговыделению в больших масштабах.
    Марко, одев защитный костюм из HL пообещал остановить экспоненциальную
    багореакцию, и где то там сейчас глубоко в жшахтах сражается с сущностями, порожденными этим ветвлящимся процессом. Лишь бы не дошло до критической массы, тогда процесс уже не остановить..

    https://forums.embarcadero.com/thread.jspa?threadID=248231&tstart=90
  • VOsipov © (23.05.17 09:01) [24]

    > Кто б сомневался ©   (23.05.17 01:21) [20]
    >
    >
    > > А в больших приложениях с кучей форм программа вылетает(
    >
    >
    > Ну а причем тут Delphi?
    > Это просто ваша криворукость. Android закрывает программы
    > если недостаточно памяти или программа отжирает много.


    Поосторожнее с оскорблениями. Формы не открыты все одновременно. Открыта главная, из нее вызывается ТОЛЬКО одна второстепенная форма, которая освобождается из памяти согласно примера из оф.справки
  • Дмитрий Белькевич © (23.05.17 10:32) [25]

    > Формы не открыты все одновременно.


    Не открыты или не созданы?
  • Кто б сомневался © (23.05.17 13:04) [26]

    > VOsipov ©   (23.05.17 09:01) [24]


    Это не оскорбление, это дружеский стеб. :)

    Зайдите в
    Project > View Source и посмотрите какие формы создаются.

    Должна создаваться одна главная форма, и если есть DataModule, на котором лежат общие стили и ImageList .

    Например:

    begin
     GlobalUseGPUCanvas := true;
     Application.Initialize;
     gCore := TCore.Create;
     Application.CreateForm(TDataMod, gDataMod);
     if gCore.Settings.HasSetupInfo then
       Application.CreateForm(TfrmMain, frmMain)
     else
       Application.CreateForm(TfrmSetup, frmSetup);

     Application.Run;
     gCore.Free;
    end.
  • Кто б сомневался © (23.05.17 13:13) [27]
    Чтобы создать форму, а затем уничтожить, нужно создавать ее без указание владельца (т.к. ARC).

    frmForm := TMyForm.Create(nil);

    А вот с уничтожением тут все хитро, но можно использовать Release (не Free!).
    Но лучше и проще всего сделать так - событие формы OnClose и там:

    procedure TfrmEmrgNums.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     Action := TCloseAction.caFree;
     frmEmrgNums := nil;
    end;


    А форму уничтожать просто вызвав Close.

    А создаю я формы делая class метод для каждой.

    class procedure TfrmMy.ShowMyForm;
    begin
     if frmMy = nil then
       frmMy := TfrmMy.Create(nil);

     frmMy .Show;
    end;


    Соответственно из главной формы просто вызываем одной строчкой
    TfrmMy.ShowMyForm.
  • Кто б сомневался © (23.05.17 13:16) [28]

    > class метод


    Да, тогда это называется class процедура, а не метод. Т.к. у метода есть скрытая переменная Self.
  • VOsipov © (23.05.17 14:32) [29]

    > Кто б сомневался ©


    Формы создаются не автоматически (перекидываю их в правую колонку в Project Options).

    Пользуюсь примерами из официальной справки:
    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_FireMonkey_Modal_Dialog_Boxes

    Там ни слова про Release.
    А что это за строчка:
    frmEmrgNums := nil  ?
  • Eraser © (23.05.17 16:21) [30]

    > Кто б сомневался ©   (23.05.17 03:11) [23]

    ия разработчиков, точнее, практически полное ее отсутствие, в т.ч. в QA. буду ждать хотфикс или апдейт, посмотрим.
  • Eraser © (23.05.17 16:21) [31]

    > Eraser ©   (23.05.17 16:21) [30]
    >
    > > Кто б сомневался ©   (23.05.17 03:11) [23]
    >
    > ия разработчиков, точнее, практически полное ее отсутствие

    удивляет реакция разработчиков, точнее, практически полное ее отсутствие
  • Кто б сомневался © (23.05.17 21:54) [32]
    VOsipov ©   (23.05.17 14:32) [29]

    frmEmrgNums := nil  ?

    Обнуляет переменную формы. Чтоб, если случайно к ней обратятся, сработало исключение, и сразу было видно что формы нет. По идее в ARC она должна сама обнулятся, но для универсального кода (для Mac и Windows) лучше обнулять ее.

    Release - это еще с VCL метод отложенного уничтожения формы или фрейма или контрола. Она уничтожается не сразу, а через время, когда выйдут из ее методов. Т.е можно вызвать Release прямо в методах (напр. в OnClick ) уничтожаемой формы\фрейма.
    Чтобы точно знать уничтожается форма или нет, надо ставить точку останова на Form OnDestroy.


    > Eraser ©   (23.05.17 16:21) [31]


    Реакция есть, но они в основном пишут в багтрекере, конкретно Марко Кэнту. Он говорит что активно работают над багом, пытаясь оставить изменения.
  • Eraser © (23.05.17 22:33) [33]

    > Кто б сомневался ©   (23.05.17 21:54) [32]


    > Реакция есть, но они в основном пишут в багтрекере, конкретно
    > Марко Кэнту. Он говорит что активно работают над багом,
    > пытаясь оставить изменения.

    я читал. через месяц после его обещаний выпустили хотфикс, в котором, судя по всему, проблему не устранили.
  • Кто б сомневался © (23.05.17 22:43) [34]

    > Eraser ©   (23.05.17 22:33) [33]


    Просто баг сложный, на этом потоке основана вся инфраструктура логики GUI программы и это также системный Android поток программы.
    К примеру спец. оконные флаги устанавливаются только через Android поток, через спец. обертку, соответственно нужно перелопатить кучу кода и проверить его.
    Плюс еще Android компилятор медленный, плюс возможно на некоторых устройствах может по другому работать, так что им там весело.
  • Кто б сомневался © (23.05.17 23:39) [35]
    Кто б сомневался ©   (23.05.17 01:37) [21]

    Я ошибся, нужно у обоих компонентов выставить - Align = VertCenter.
    Не надо там HorzCenter,
  • Eraser © (26.06.17 22:57) [36]
    RAD Studio 10.2 Patch for Android Released

    FireMonkey Android Compatibility Patch for RAD Studio 10.2 Tokyo
    This patch addresses critical Android issues in Delphi, C++Builder and RAD Studio 10.2 around text input for newer versions of Android (issues that were already present in Berlin), control rendering and performance regressions (issues introduced in Tokyo).

    https://cc.embarcadero.com/item/30781
  • Кто б сомневался © (27.06.17 00:45) [37]
    Вот здесь основные комменты по поводу этого бага и по поводу патча..

    https://quality.embarcadero.com/browse/RSP-17162

    Патч решает часть проблем, остальная часть осталась
  • Eraser © (27.06.17 15:32) [38]
    остается только ждать update 1.
 
Конференция "Прочее" » Delphi и Android
Есть новые Нет новых   [118462   +18][b:0][p:0.001]