在保持FormMain为主窗体的情况下,在主窗体之前创建次要窗体,是否可行?

3
在 Delphi 10.1 Berlin IDE 中,使用 VCL 表单应用程序项目,在“项目选项”对话框中,我有以下设置:

enter image description here

现在我希望在保持FormMain表单为主表单的同时,先创建formOptions表单。原因是:主表单可以在其FormCreate过程中加载数据(此时formOptions尚未创建),但要处理这些数据,它需要来自formOptions表单的设置。
但是,一旦我将formOptions项目拖到列表顶部,上面的主表单组合框也会更改为formOptions
那么,如何在保持FormMain表单为主表单的同时,使formOptions表单先于FormMain表单创建?

3
从自动列表中移除它,并使用 formOptions := TformOptions.Create 替换 Application.CreateForm。 - Sertac Akyuz
你是指在 DPR 项目文件中吗? - user1580348
这个可以用。所以我必须使用nil作为AOwner,因为主窗体还没有被创建:formOptions := TformOptions.Create(nil);。在程序中使用nil作为所有者是正确的吗?我需要在程序结束时手动销毁formOptions吗? - user1580348
1
自动创建的表单使用 Application 作为所有者。如果您使用 nil 所有者,那么您必须手动释放该表单。 - Remy Lebeau
1个回答

11

使用Application.CreateForm()方法创建的第一个TForm将成为VCL的Application.MainForm,并且不能更改。因此,在CreateForm()分配MainForm之前,您需要进行任何初始化操作。

您有两个选项:

  1. 从自动创建列表中删除formOptions(从而删除生成的CreateForm()调用),然后在代码中手动创建它。 CreateForm()直到完全创建后才会分配MainForm,因此您实际上可以通过以下两种方式之一来处理此问题:

    a. 直接在项目的.dpr文件中:

    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    formOptions := TFormOptions.Create(Application);
    Application.CreateForm(TFormMain, FormMain);
    Application.Run;
    
    b. 在 MainForm 的 OnCreate 事件中:
    procedure TFormMain.FormCreate(Sender: TObject);
    begin
      formOptions := TFormOptions.Create(Application); // or even Self
    end;
    
    将您的共享设置移至TDataModule(甚至是一个独立的类),然后在创建任何表单之前(自动)创建该对象。当需要时,FormMainformOptions可以从那个对象中检索它们的设置。
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TSettingsDM, SettingsDM);
    Application.CreateForm(TFormMain, FormMain);
    Application.CreateForm(TFormOptions, formOptions);
    Application.Run;
    

非常感谢您的解释和解决方案! - user1580348

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接