gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:24:50 29 4
gpt4 key购买 nike

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

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

但是,如果我想使用标准按钮(在子窗体本身内部)关闭 MDI 子窗体,该怎么办?如果我在事件处理程序中调用 Close,则会收到访问冲突异常。

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

我已经搜索了类似的问题,并尝试了各种代码,但仍然遇到异常。

最佳答案

从同一子窗体的按钮 OnClick 事件内部调用子 MDI 窗体上的 Close()完全安全的。在内部,Close() 会触发 OnClose 事件,如果 Action 参数设置为 caFree,则 Form将对其自身调用Release(),这是一个延迟操作在安全时将从内存中释放表单。

下面的代码在 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().

关于delphi - 如何在不使用系统关闭按钮的情况下关闭 MDI 子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40800380/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com