【问题标题】:DUnit test - Cannot create form. No MDI forms are currently activeDUnit 测试 - 无法创建表单。当前没有 MDI 表单处于活动状态
【发布时间】:2017-12-05 18:18:18
【问题描述】:

我从 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 的 Create,将 FormStyle 属性设置为“fsNormal”而不是“fsMDIChild”,什么也没有。我还发现了一些关于使用 sleep(500) 的想法,但问题仍然存在。

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

还有其他建议吗? tks!

【问题讨论】:

    标签: delphi-2009 dunit


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我会试试的。缺点是必须在 .dpr 文件中手动映射父级附带的所有引用,一旦不是自动完成,我找不到映射整个特定文件夹的方法。
    【解决方案2】:

    经过几次尝试,我只删除了子 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 提供见解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多