我有一个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)时,它才会失败。如果我评论那条线,它会完美地工作。

任何想法,为什么我实际上关闭应用程序时尝试创建表单?????

最佳答案

我在某些网站上查找并发现了问题。看起来最好将Owner设置为Application,而不是主表单。雷米·勒博(Remy Lebeau)提出,真正的问题出在 child 形式的OnDestroy。包含过滤器的窗口没有有效的句柄,然后调用OnDestroy。因此,更改销毁顺序将使TFrmDereplic.OnDestroy有机会正确执行。
所以,这是解决方案:
解决方案

或者

第二个需要很少的额外代码行,因为并不总是调用OnClose。
这是从Delphi HELP中提取的:

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

关于delphi - "Cannot create form. No MDI forms are currently active"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3949049/

10-11 01:06