-
> А в больших приложениях с кучей форм программа вылетает(
Ну а причем тут Delphi? Это просто ваша криворукость. Android закрывает программы если недостаточно памяти или программа отжирает много. iOS еще строже в этом плане. Это не Windows с его бесконечным свопом. Нужно переучиваться кодить с десктоп стиля "а создам как я все сразу при старте", на мобильный где ресурсов мало.
Формы нужно создавать тогда, когда они нужны, а затем уничтожать. У меня на проекте, над которым сейчас работаю уже 11 форм. И работает, даже на древнем Ice Cream 4.0.1 без тормозов.
Никаких ограничений нет на кол. экранов\форм, просто их нужно в нужное время создавать, и затем по возможности уничтожать.
И вообще, что значит вылетает, запустите под отладчиком.
Еще народ бывает понапихает в один ListBox Item всего разного (который на деле ScrollBar с визуальными компонентами), и создают потом по 100 Items и удивляются что ж тормозит то (для этого есть ListView с DynamicApearance ).
-
И кстати имитировать модальное окно-диалог проще так (конечно он будет вызываться через 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);
-
> Кто б сомневался ©
как у знатока FMX спрашиваю, чем плох Tokio для андроид и в каких именно ситуациях плох? решаю тут, стоит ли переходить на новую версию или подождать с подпиской.
-
Плох тем, что он там фактически не работает, а именно сильно тормозит и часть функционала потеряна - не работают эффекты, проблемы с анимацией, все порушилось. Раньше был основной Android GUI поток и Delphi main поток. Они решили перенести Delphi главный поток в Android поток, как в Delphi IOS кстати сделано, и недотестировали, и началась неуправляемая цепная багореакция, деления тяжёлых багов полученными при делении багов в предыдущем поколении, уход элементов за пределы объёма кода, поддерживающего цепной процесс, что приводит юзеров к энерговыделению в больших масштабах. Марко, одев защитный костюм из HL пообещал остановить экспоненциальную багореакцию, и где то там сейчас глубоко в жшахтах сражается с сущностями, порожденными этим ветвлящимся процессом. Лишь бы не дошло до критической массы, тогда процесс уже не остановить.. https://forums.embarcadero.com/thread.jspa?threadID=248231&tstart=90
-
> Кто б сомневался © (23.05.17 01:21) [20] > > > > А в больших приложениях с кучей форм программа вылетает( > > > Ну а причем тут Delphi? > Это просто ваша криворукость. Android закрывает программы > если недостаточно памяти или программа отжирает много.
Поосторожнее с оскорблениями. Формы не открыты все одновременно. Открыта главная, из нее вызывается ТОЛЬКО одна второстепенная форма, которая освобождается из памяти согласно примера из оф.справки
-
> Формы не открыты все одновременно.
Не открыты или не созданы?
-
> 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.
-
Чтобы создать форму, а затем уничтожить, нужно создавать ее без указание владельца (т.к. 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.
-
> class метод
Да, тогда это называется class процедура, а не метод. Т.к. у метода есть скрытая переменная Self.
-
-
> Кто б сомневался © (23.05.17 03:11) [23]
ия разработчиков, точнее, практически полное ее отсутствие, в т.ч. в QA. буду ждать хотфикс или апдейт, посмотрим.
-
> Eraser © (23.05.17 16:21) [30] > > > Кто б сомневался © (23.05.17 03:11) [23] > > ия разработчиков, точнее, практически полное ее отсутствие
удивляет реакция разработчиков, точнее, практически полное ее отсутствие
-
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]
Реакция есть, но они в основном пишут в багтрекере, конкретно Марко Кэнту. Он говорит что активно работают над багом, пытаясь оставить изменения.
-
> Кто б сомневался © (23.05.17 21:54) [32]
> Реакция есть, но они в основном пишут в багтрекере, конкретно > Марко Кэнту. Он говорит что активно работают над багом, > пытаясь оставить изменения.
я читал. через месяц после его обещаний выпустили хотфикс, в котором, судя по всему, проблему не устранили.
-
> Eraser © (23.05.17 22:33) [33]
Просто баг сложный, на этом потоке основана вся инфраструктура логики GUI программы и это также системный Android поток программы. К примеру спец. оконные флаги устанавливаются только через Android поток, через спец. обертку, соответственно нужно перелопатить кучу кода и проверить его. Плюс еще Android компилятор медленный, плюс возможно на некоторых устройствах может по другому работать, так что им там весело.
-
Кто б сомневался © (23.05.17 01:37) [21]
Я ошибся, нужно у обоих компонентов выставить - Align = VertCenter. Не надо там HorzCenter,
-
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
-
-
остается только ждать update 1.
|