procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i : integer;
begin
CanClose := true;
if Application.MainForm = self then begin
CanClose := MessageDlg('Close the application?', mtConfirmation,
[mbYes, mbNo], 0) = mrYes;
if CanClose then
for i := 0 to Screen.FormCount - 1 do
if Screen.Forms[i] <> self then Screen.Forms[i].Close;
end;
end;
3条答案
按热度按时间n3h0vuf21#
处理这个问题的一个整洁的地方是主窗体的
OnCloseQuery
事件。上面建议的第一个检查仅在使用主窗体的多个示例时才有用。对
self
的第二次检查是必要的,以防止重新进入。lymgl2op2#
您可以使用OnDestroy而不是OnClose来保存它。你可能应该在它关闭后销毁你的次级形式(在打开之前创建):
在Form2.OnClose中:
您还需要删除.dpr中自动创建辅助表单的行:
或许还能让这个自动生成功能失效。在D7中:工具>>环境选项>>设计器>>禁用“自动创建...”
这样做可以保存一些内存。当您希望用户在返回主窗体之前关闭辅助窗体时,也可以考虑使用ShowModal,而不是Show。
iovurdzv3#
不能保证OnClose会被调用。
(详情来自Peter B,
https://groups.google.com/g/borland.public.delphi.objectpascal/c/82AG0_kHonU/m/ft53lAjxWRMJ)
通过一个名为“应用程序”的按钮关闭表单。
OnShow来电
毁灭召唤
OnHide打来电话
OnDestroy打电话来
通过调用Form1.Close的按钮关闭表单,在FormClose中使用Action:= caFree:
OnShow来电
OnCloseQuery已调用。
在关闭调用
毁灭召唤
OnHide打来电话
OnDestroy打电话来
通过系统菜单关闭表单:
OnShow来电
OnCloseQuery已调用。
在关闭调用
毁灭召唤
OnHide打来电话
OnDestroy打电话来
通过注销Win NT关闭应用程序:
OnShow来电
OnCloseQuery已调用。
两种解决方案: