加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – “无法创建表单.没有MDI表单当前处于活动状态“错误

发布时间:2020-12-15 04:18:10 所属栏目:大数据 来源:网络整理
导读:我有一个MDI主(父)表单和一个MDI子表单.我在运行时创建了这样的子代: VAR FrmDereplic: TFrmDereplic;procedure TMainFrm.Button2Click(Sender: TObject);begin FrmDereplic:= TFrmDereplic.Create(MainFrm); FrmDereplic.Show;end; 重现错误的步骤: 我启
我有一个MDI主(父)表单和一个MDI子表单.我在运行时创建了这样的子代:
VAR
   FrmDereplic: TFrmDereplic;

procedure TMainFrm.Button2Click(Sender: TObject);
begin
 FrmDereplic:= TFrmDereplic.Create(MainFrm);
 FrmDereplic.Show;
end;

重现错误的步骤:
我启动应用程序,按下按钮创建孩子,我按下主(父)表单上的’x’按钮关闭应用程序,我得到一个“无法创建表单.没有MDI表单当前处于活动状态”错误.

出现错误的行在子窗体中:

procedure TFrmDereplic.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action:= caFree;
end;

procedure TFrmDereplic.FormDestroy(Sender: TObject);
VAR MyIniFile: TCubicIniFile;
begin
 MyIniFile:= TCubicIniFile.Create(AppINIFile);
 TRY
  with MyIniFile DO
  begin
   if WindowState<> wsMaximized then
    begin
     // save form's screen pos
     ...
    end;
   WriteInteger  ('Dereplicator','fltExtensions',fltExtensions.ItemIndex);  <----- HERE
 FINALLY
  FreeAndNil(MyIniFile);
 END;
end;

我将很多表单的属性(以及其他控件属性)保存到INI文件中.但是当我尝试保存fltExtensions.ItemIndex(这是一个TFilterComboBox)时它才会失败.如果我评论那条线它完美无缺.

知道为什么它在我实际关闭应用程序时尝试创建一个表单?????????

解决方法

我查看了一些网站,发现了问题.如果所有者是应用程序而不是主要表单,看起来更好. Remy Lebeau认为真正的问题在于儿童形式的OnDestroy.保持过滤器的窗口没有有效的句柄,然后调用OnDestroy.因此,更改销毁顺序使TFrmDereplic.OnDestroy有机会正确执行.

所以,这是解决方案:

SOLUTION(S)

FrmDereplic:=
TFrmDereplic.Create(Application);

要么

Do not save form’s properties in
OnDestroy

第二个需要额外的代码行,因为OnClose甚至不总是被调用.
这是从Delphi HELP中提取的:

Note: When the application shuts
down,the main form receives an
OnClose event,but any child forms do not receive the OnClose event.

如果使用Application.Terminate,则不会调用onCloseQuery和onClose. Halt也是一样(但是……这太极端了吧?).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读