• 0
d7d1cd

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

Вопросы

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 ответов на этот вопрос

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

Изменено пользователем Barbanel

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 часа назад, Barbanel сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
2 минуты назад, d7d1cd сказал:

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

Цитата

lControl.ApplyStyleLookup();

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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