我有一个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/