Delphi -未调用辅助窗体的OnClose处理程序

kuarbcqp  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(159)

我有一个主要形式和另一个“次要”形式。如果我先关闭辅助服务器,则会调用它的OnClose处理程序。不幸的是,如果我先关闭主窗体,应用程序将终止,并且不会调用辅助窗体的OnClose。这是一个问题,因为我想保存的位置和大小的每一个形式之前,他们被关闭。我该如何解决这个问题?

n3h0vuf2

n3h0vuf21#

处理这个问题的一个整洁的地方是主窗体的OnCloseQuery事件。

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;

上面建议的第一个检查仅在使用主窗体的多个示例时才有用。对self的第二次检查是必要的,以防止重新进入。

lymgl2op

lymgl2op2#

您可以使用OnDestroy而不是OnClose来保存它。你可能应该在它关闭后销毁你的次级形式(在打开之前创建):

Form2 := TForm2.Create(Application);
Form2.Open;

在Form2.OnClose中:

Action := caFree;

您还需要删除.dpr中自动创建辅助表单的行:

Application.CreateForm(TForm2, Form2);

或许还能让这个自动生成功能失效。在D7中:工具>>环境选项>>设计器>>禁用“自动创建...”
这样做可以保存一些内存。当您希望用户在返回主窗体之前关闭辅助窗体时,也可以考虑使用ShowModal,而不是Show。

iovurdzv

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已调用。
两种解决方案:

  • 从上面的所有代码中调用一个自定义过程,并在该过程中设置一个bool变量。测试它,所以这个过程只被调用一次。把你的清理代码放在那里。
  • 删除析构函数。

相关问题