Ali*_*van 4 delphi mdi delphi-7
我通过单击系统关闭按钮使用下面的代码关闭MDI子窗体,它工作正常:
procedure Tfrm_main.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想通过使用标准按钮(在子表单本身内)关闭MDI子表单.如果我Close在事件处理程序中调用,那么我会收到访问冲突异常.
有没有办法通过使用放置在子表单本身内的标准按钮(不是系统关闭按钮)来关闭MDI子表单,而不会引发访问冲突异常?
我已经完成了类似的问题搜索,并尝试了各种代码,但仍然有例外.
Close()从OnClick同一子表单的按钮事件内部调用子MDI 表单是非常安全的.在内部,Close()触发OnClose事件,如果Action参数设置为,caFree则表单将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.
Run Code Online (Sandbox Code Playgroud)
如果您呼叫的时候得到一个访问冲突Close(),最可能的罪魁祸首是你调用Close()上无效表格指针.