我有一个主要表格和另一个“次要”表格。如果我先关闭辅助节点,则会调用其OnClose
处理程序。不幸的是,如果我先关闭主窗体,应用程序将终止,并且不会调用辅助节点的OnClose
。这是一个问题,因为我想在关闭之前保存每个表单的位置和大小。我该如何解决这个问题?
答案 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
进行第二次检查以防止重新进入。