我开始使用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!
答案 0 :(得分:1)
当 您看到的错误表示您的项目未创建 在其构造函数或TForm
将FormStyle
设置为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
的洞察力。