在 C++ Builder 中启动时从加载屏幕打开表单

Open Form from a loading screen at startup in C++ Builder

我有一个带有 MainForm 的应用程序,它是一个加载屏幕。在后台完成一些事情时会显示此表单,例如决定接下来启动哪个表单。我无法让它工作,我一直遇到访问冲突错误。

感谢这个主题,我明白了原因:Open two forms at startup in c++ builder。但是建议的解决方案对我来说是不可接受的,因为我在设计时不知道哪个表单将首先显示。

正确的做法是什么?

I have an application with a MainForm which is a loading screen.

不要那样做。在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 "owns" 主项目源文件,它可能会 modify/delete/corrupt 您的自定义代码在项目开发生命周期的某个时刻。因此,在调用 Application->Initialize()Application->Run() 之间放置自定义代码时,请非常小心。并确保您有良好的备份。