DUnit 测试 - 无法创建表单。当前没有激活的 MDI 表格

DUnit test - Cannot create form. No MDI forms are currently active

我从 DUnit 测试开始,对于任何新手错误提前表示歉意。当我尝试 运行 简单测试并且编译器 运行 设置我的测试 class 时,它停止返回消息“无法创建表单。当前没有活动的 MDI 表单'。

经过一些研究,我找到了一些解释,但 none 与我的问题有关。

问题似乎是当我调用我的 child 来源 class 的 Create 方法时 - 我所说的来源是指 class 我拥有所有程序和函数的地方经过测试,让我们通过 TfrmFoo 调用它。而我的 test class 应该是 TestTfrmFoo。 TFrmFoo 有一个带有一些基本代码的 parent,TfrmParentFoo。

我这样调用 Create 方法:

...

implementation

procedure TestTfrmFoo.SetUp;
begin

    FfrmParentFoo := TfrmParentFoo.Create(nil);

    FfrmFoo := TfrmFoo.Create(FfrmParentFoo);    

end;

procedure TestTfrmFoo.TearDown;
begin
    FfrmFoo.Free;
    FfrmFoo := nil;
end;

...

之后调用TfrmFooclass的Create方法,出现如下错误:'无法创建表单。当前没有活动的 MDI 表单'。

我已经尝试覆盖 child class TfrmFoo 的创建,将 FormStyle 属性 设置为 'fsNormal' 而不是 'fsMDIChild' 并且什么也没有。我还发现了一些关于使用 sleep(500) 的想法,但问题仍然存在。

已编辑:Remy Lebeau 贡献之后,我更改了 SetUp 测试以在调用 child 之前创建 parent 表单,并将其用作创建 child 的参数。同样的错误信息。我是不是改错了什么?

还有其他提示吗?谢谢!

TForm 将其 FormStyle 设置为 fsMDIChild 时,项目 必须 创建一个 Application.MainForm,其 FormStyle 设置为 fsMDIForm。这是 VCL 的 硬编码要求,而不是底层 MDI 系统(不过,有一种方法 circumvent this limitation 通过一些手动工作)。

您看到的错误意味着您的项目没有创建 Application.MainForm 并在创建任何 fsMDIChild 表单之前将其设置为 fsMDIForm。你需要解决这个问题。

在其构造函数或 OnCreate 事件中设置子窗体的 FormStyle 为时已晚,因为错误发生在子窗体创建其 HWND 时,这发生在 DFM 流处理的早期,早于Create/OnCreate 有机会尝试分配 FormStyle.

经过几次尝试,我只删除了子 Create 方法
FfrmFoo := TfrmFoo.Create(FfrmParentFoo); 工作起来很有魅力 :D。

问题是因为我试图创建一个新的子实例,即使在创建了一个新的父实例之后。最终代码如下:

...

implementation

procedure TestTfrmFoo.SetUp;
begin

  FfrmParentFoo := TfrmParentFoo.Create(nil);    

end;

procedure TestTfrmFoo.TearDown;
begin
  FfrmFoo.Free;
  FfrmFoo := nil;
end;

...

感谢 Remy Lebeau 的见解。