0

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

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

问题似乎是当我调用我的子源类的 Create 方法时 - 原点是指我拥有所有要测试的过程和函数的类,让我们通过 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方法,出现如下错误:' Cannot create form. 当前没有 MDI 表单处于活动状态'。

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

编辑:贡献 后Remy Lebeau,我更改了SetUp测试以在调用子窗体之前创建父窗体,并将其用作创建子窗体的参数。相同的错误信息。我是不是改错了什么?

还有其他提示吗?谢谢!

4

2 回答 2

1

当 a设置为时,项目必须创建一个TForm设置为的项目。这是VCL 的硬编码要求,而不是底层 MDI 系统(尽管有一种方法可以通过一些手动工作来规避这个限制)。FormStylefsMDIChildApplication.MainFormFormStylefsMDIForm

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

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

于 2017-12-05T22:23:29.003 回答
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您的洞察力。

于 2017-12-06T15:49:20.813 回答