Открыть форму с экрана загрузки при запуске в C ++ Builder - PullRequest
0 голосов
/ 20 марта 2020

У меня есть приложение с MainForm, которое является экраном загрузки. Эта форма отображается в то время, как некоторые вещи выполняются в фоновом режиме, например, решение о том, какую форму запускать дальше. Я не могу заставить это работать, я продолжаю иметь ошибку нарушения доступа.

Я получил, почему благодаря этой теме: Откройте две формы при запуске в c ++ builder . Но предлагаемое решение для меня неприемлемо, так как я не знаю во время разработки, какая форма будет отображаться первой.

Как правильно это сделать?

1 Ответ

0 голосов
/ 20 марта 2020

У меня есть приложение с MainForm, которое является экраном загрузки.

Не делайте этого. В VCL MainForm нельзя изменить после его установки, и приложение закроется, когда MainForm будет закрыто. MainForm устанавливается при первом вызове на Application->CreateForm(). Если вы хотите создать Формы до создания MainForm, вы должны использовать вместо этого оператор new, например:

Application->Initialize();

TLoadingForm *LoadingForm = new TLoadingForm(Application);
LoadingForm->Show();
LoadingForm->Update();

...

Application->CreateForm(__classid(TForm1), &Form1); 
...

LoadingForm->Close();
delete LoadingForm;

Application->Run();
...

Если вы хотите принять решение о том, какой TForm будет реальным MainForm во время выполнения вы можете сделать это, например:

Application->Initialize();

TLoadingForm *LoadingForm = new TLoadingForm(Application);
LoadingForm->Show();
LoadingForm->Update();

...

if (someCondition)
    Application->CreateForm(__classid(TForm1), &Form1); 
else
    Application->CreateForm(__classid(TForm2), &Form2); 
...

LoadingForm->Close();
delete LoadingForm;

Application->Run();
...

Имейте в виду, что IDE "владеет" основным исходным файлом проекта и, скорее всего, сможет изменить / удалить / повредить ваш пользовательский код в какой-то момент в течение срока разработки вашего проекта. Поэтому будьте очень осторожны , используя собственный код, который вы размещаете между вызовами Application->Initialize() и Application->Run(). И убедитесь, что у вас есть хорошие резервные копии.

...