如何在不使用系统关闭按钮的情况下关闭MDI子项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不使用系统关闭按钮的情况下关闭MDI子项相关的知识,希望对你有一定的参考价值。

我通过单击系统关闭按钮使用下面的代码关闭MDI子窗体,它工作正常:

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

但是,如果我想通过使用标准按钮(在子表单本身内)关闭MDI子表单。如果我在事件处理程序中调用Close,那么我会收到访问冲突异常。

有没有办法通过使用放置在子表单本身内的标准按钮(不是系统关闭按钮)来关闭MDI子表单,而不会引发访问冲突异常?

我已经完成了类似的问题搜索,并尝试了各种代码,但仍然有例外。

答案

从同一个孩子表格的按钮Close()事件内的儿童MDI表格上调用OnClick是绝对安全的。在内部,Close()触发OnClose事件,如果Action参数设置为caFree,那么Form将自己调用Release(),这是一种延迟动作,可以在安全的情况下将Form从内存中释放出来。

以下代码在Delphi 7中对我来说非常好用:

unit ChildUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TChildForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ChildForm: TChildForm;

implementation

{$R *.dfm}

procedure TChildForm.Button1Click(Sender: TObject);
begin
  Close;
end;

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

end.

如果您在调用Close()时遇到访问冲突,最可能的罪魁祸首是您在无效的表单指针上调用Close()

以上是关于如何在不使用系统关闭按钮的情况下关闭MDI子项的主要内容,如果未能解决你的问题,请参考以下文章

在不终止启动 Python 脚本的情况下关闭 pyqt5 GUI

如何在不关闭模式的情况下关闭从 modalViewController 推送的 viewController?

如何在不关闭 TCP 连接的情况下关闭处理 TCP 请求的线程?

有没有办法在不关闭底层流的情况下关闭 Writer?

为啥我不能在不更改或保存更改的情况下关闭此模式?

在 SplitContainer 中关闭 mdi 子项