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
的见解。
我从 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
的见解。