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

Как не показывать главное окно до полной его отрисовки?


Вопрос

Перевожу большой проект из VCL в FMX. В ходе запуска на главном окне много чего рисуется и выравнивается; соответствующий код записан в FormShow. Пока всё не отработало, показывается заставка, splash window. В конце, как и положено, запускается Application.Run, на экране появляется готовая главная форма, а заставка убивается Под VCL всё это выглядело именно так. Под FMX же главная форма выводится на экран в самом начале отрисовки, вместе с заставкой, и пользователь вынужден наблюдать всю отрисовку в режиме реального времени, с мельканиями и дерганиями. Как подавить этот преждевременный вывод?

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

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

  • 0
1 час назад, Вадим Смоленский сказал:

Перевожу большой проект из VCL в FMX. В ходе запуска на главном окне много чего рисуется и выравнивается; соответствующий код записан в FormShow. Пока всё не отработало, показывается заставка, splash window. В конце, как и положено, запускается Application.Run, на экране появляется готовая главная форма, а заставка убивается Под VCL всё это выглядело именно так. Под FMX же главная форма выводится на экран в самом начале отрисовки, вместе с заставкой, и пользователь вынужден наблюдать всю отрисовку в режиме реального времени, с мельканиями и дерганиями. Как подавить этот преждевременный вывод?

А показывать сплэш поверх всех элементов до момента полной отрисовки не вариант?

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

а почему не подготовить все что нужно в FormCreate 

Теоретически можно, конечно. Но слишком много чего придется перестраивать. Окон создается много, юниты ссылаются друг на друга, логичнее начинать рисование, когда всё создано. Вот и хотел узнать, нет ли какого-то простого решения.

А показывать сплэш поверх всех элементов до момента полной отрисовки не вариант?

Ну, наверное, один из вариантов. Разве что не очень изящный.

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

А вот, придумался не очень элегантный, но надежный вариант. Процедуру FormShow переименовал в JustBeforeFormShow и вызываю ее не как обработчик события OnShow, а чуть раньше, из обработчика события OnCreate одной из мелких форм, которая создается самой последней. Всё теперь красиво.

Спасибо коллегам за высказанные мысли. Полагаю, именно они меня и натолкнули на верное решение.

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

вадим, из вашего текста следует, что у вас все формы создаются при старте приложения

но это и раньше было плохой практикой, а на мобилах и подавно

Ссылка на комментарий
  • 0
7 часов назад, krapotkin сказал:

вадим, из вашего текста следует, что у вас все формы создаются при старте приложения

но это и раньше было плохой практикой, а на мобилах и подавно

Да кстати это плохая практика. К примеру под iOS если программа потребляет много памяти сначала получает didReceiveMemoryWarning, затем автоматом убивается системой.

Android попроще в этом плане, но тоже особо не жалует, и если такая прога будет в фоне, и как только потребуется память, то первыми на вылет.

В общем это не Винда с ее "бесконечным" виртуальным свопом..

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

Изменено пользователем ENRGY
Ссылка на комментарий
  • 0

Мобильных приложений я пока не делаю и едва ли буду. Только Windows, в ближней перспективе Mac.

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

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

Мне это видится примерно так:

Отключите автоматическое создание форм.

Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.

Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).

На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма

и скройте Splash-форму.

 

З.Ы. И, да - лучше оперировать фреймами и создавать их и удалять только тогда, когда они нужны. На скорость это практически не влияет, даже если у вас меню будут фреймами... Это из личного опыта - все достаточно быстро!

Ссылка на комментарий
  • 0
В 11.03.2017 в 14:42, AlexG сказал:

Мне это видится примерно так:

Отключите автоматическое создание форм.

Сначала создайте Splash-форму (эту можно оставить в автомате). Отобразите ее.

Создайте вашу "главную" форму. В процедуре OnFormCreate сделайте Preload для стиля (тут на форуме это обсуждалось) - это позволит загрузить стиль, отрисовать все и только затем отобразит вашу форму (по крайней мере - отрисовка произойдет мгновенно, проверено на формах с сотнями компонентов).

На OnShow вашей "главной" формы сделайте Application.MainForm := ваша_"главная"_форма

и скройте Splash-форму.

Сделал по указанному варианту. Работает везде кроме iOS, splash не показывается, логотип висит до отрисовки form1

begin
  Application.Initialize;
  Application.FormFactor.Orientations := [TFormOrientation.Portrait];

  Application.CreateForm(TSplashForm, SplashForm);
  Application.Run;
end.
procedure TSplashForm.FormShow(Sender: TObject);
begin
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm5, Form5);
  Application.CreateForm(TForm6, Form6);
  Application.CreateForm(TForm7, Form7);
  Application.CreateForm(TForm8, Form8);
  Application.CreateForm(TForm9, Form9);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm10, Form10);
  Application.CreateForm(TForm11, Form11);
  Application.CreateForm(TfBaseDialog, fBaseDialog);
  Application.CreateForm(TForm12, Form12);

  PreloadConfiguration;

  form1.Show;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
  application.MainForm := Form1;
  SplashForm.Close;
end;

 

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

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

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

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

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

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

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

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

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

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