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

Компоненты вкладки с другой формы/фрейма


d7d1cd

Вопрос

Приветствую всех. Создаю мобильное приложение для Андроид. Основа - TTabControl на главной форме с двумя вкладками, заголовки вкладок скрыты. На первой вкладке список задач, которые может выполнять приложение. При выборе задачи анимарованно (используя SetActivTabWithTransition) открывается вторая вкладка с элементами управления для выбранной задачи.

Элементы управления для каждой задачи реализованы на отдельных формах: на форму кладется TVertScrollBox (Align = Client), а в него уже необходимые элементы управления. Когда пользователь выбирает задачу, то нужная форма создается динамически, родитель TVertScrollBox у этой формы меняется на вторую вкладку TTabControl и вызывается SetActivTabWithTransition. Когда пользователь жмет кнопку "Назад" (аппаратную или программную), то, опять же анимированно, открывается первая вкладка (со списком задач), родитель у TVertScrollBox обратно меняется на созданную ранее форму, форма удаляется оператором delete.

Подскажите, не будет ли при таком подходе утечек памяти? На Windows уверен, что не будет, а вот на Андроид не знаю... Кроме этого, целесообразно ли применять форму? Или лучше использовать фрейм? Или же изложенный мной подход вообще не заслуживает реализации? ?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Реализовал вышеуказанное за некоторым исключением. При выборе пользователем задачи, вкладка в TTabControl создается динамически. Элементы управления для определенного "экрана" хранятся на фрейме, который тоже создается динамически. При этом владельцем указывается ранее созданная вкладка. Затем вкладка делается родителем фрейма и она (вкладка) анимированно отображается. При возврате на "экран" со списком задач вкладка удаляется из TTabControl и память занятая ею удаляется оператором delete (а так как вкладка была владельцем фрейма, то и он освобождает память).

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

Ссылка на комментарий
  • 0

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

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

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

Изменено пользователем Barbanel
Ссылка на комментарий
  • 0
2 часа назад, Barbanel сказал:

Чтобы побороть именно этот случай, нужно компонентам заранее присваивать стиль программно, до первой отрисовки, т.е. до того как вы меняете родителя.

Подскажите, как заранее присвоить стиль программно.

P. S. Смена табов рывками происходит только на Андроид. На Windows все плавно.

Ссылка на комментарий
  • 0
2 минуты назад, d7d1cd сказал:

Подскажите, как заранее присвоить стиль программно.

Цитата

lControl.ApplyStyleLookup();

 

3 минуты назад, d7d1cd сказал:

Смена табов рывками происходит только на Андроид. На Windows все плавно.

У нас было аналогично, под Андроидом наблюдались микрофризы, а под Виндовс все выглядело гладко.
Возможно производительности ПК под Виндовс с лихвой хватает, а под Аднроидом ощущается нехватка скорости/оптимизации.
Я думаю тут Ярослав мог бы дать ответ.

Ссылка на комментарий
  • 0

Применил программно стиль, используя код Ярослава, но не до (как советовал Barbanel), а после назначения родителя фрейму (иначе все равно тормозит). То есть, добавил вкладку в табконтрол (метод Add), создал динамически фрейм, назначил ему родителем созданную вкладку и применил стиль ко всем компонентам, начиная с фрейма. Если открыть приложение и выбрать из списка задачу, то теперь при открытии "окна" этой задачи наблюдается незначительная не плавность появления (гораздо меньше, чем до использования предварительной загрузки стиля). Возврат на "экран" со списком задач происходит плавно. И если снова выбрать задачу, то ее "окно" уже появляется без тормозов.

То есть, первая смена вкладок с момента запуска приложения чуть-чуть подтормаживает. Затем все работает плавно. Пробовал заранее применять стиль ко всему табконтролу и его содержимому, но это не помогло.

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...