Delphi - 未调用辅助表单的OnClose处理程序

时间:2014-01-21 16:44:18

标签: forms delphi

我有一个主要表格和另一个“次要”表格。如果我先关闭辅助节点,则会调用其OnClose处理程序。不幸的是,如果我先关闭主窗体,应用程序将终止,并且不会调用辅助节点的OnClose。这是一个问题,因为我想在关闭之前保存每个表单的位置和大小。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

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

在Form2.OnClose中:

Action := caFree;

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

Application.CreateForm(TForm2, Form2);

也许禁用此自动创建。在D7中:工具>>环境选项>>设计师>>禁用“自动创建...”

这样做可以节省一些内存。如果您希望用户在返回主要表单之前关闭辅助表单,也可以考虑使用ShowModal而不是Show。

答案 1 :(得分:3)

处理此问题的整洁地方是主要表单的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进行第二次检查以防止重新进入。