DUnit测试 - 无法创建表单。目前没有MDI表单处于活动状态

时间:2017-12-05 18:18:18

标签: delphi-2009 dunit

我开始使用DUnit测试,所以很抱歉任何新手的错误。当我尝试运行简单测试并且编译器运行我的测试类的SetUp时,它停止返回消息'无法创建表单。目前没有MDI表单'。

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

问题似乎是当我调用我的子类原始类的Create方法时 - 通过origin我的意思是我有所有要测试的过程和函数的类,让我们通过TfrmFoo调用它。我的测试类应该是TestTfrmFoo。 TFrmFoo的父级有一些基本代码,即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;

...

之后,调用TfrmFoo类的Create方法并发生以下错误:'无法创建表单。目前没有MDI表单'。

我已经尝试覆盖我的子类TfrmFoo的Create,将FormStyle属性设置为'fsNormal'而不是'fsMDIChild',什么都没有。我也发现了一些关于使用睡眠的想法(500),但问题还在继续。

编辑:Remy Lebeau贡献之后,我更改了SetUp测试以在调用子项之前创建父表单,并将其用作Create子项的参数。相同的错误消息。我改错了吗?

还有其他提示吗? TKS!

2 个答案:

答案 0 :(得分:1)

TFormFormStyle设置为fsMDIChild时,项目必须创建Application.MainForm,其FormStyle为设为fsMDIForm。这是VCL 的硬编码要求,而不是基础MDI系统(但是,circumvent this limitation可以通过一些手动工作来实现。{/ p>

您看到的错误表示您的项目未创建Application.MainForm,并且在创建任何fsMDIForm表单之前设置为fsMDIChild。你需要解决这个问题。

在其构造函数或FormStyle事件中设置子表单OnCreate为时已晚,因为当子表单创建其HWND时会发生错误,这在DFM流式处理过程的早期发生,在Create / OnCreate有机会尝试分配FormStyle之前。

答案 1 :(得分:0)

经过几次尝试,我只删除了子方法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的洞察力。