如何知道为什么'OnCloseQuery'被调用 - MDI子关闭或应用程序关闭?

时间:2012-12-27 12:16:24

标签: delphi mdi

我目前正在开发MDI应用程序 每次创建新的MDI子窗口时,它的基础数据都会动态保存到SQLite数据库,而open列设置为1,因此如果用户关闭程序并重新打开它,窗户恢复(也是在任何不良 TM 的情况下) 因此,每个文档始终存在于数据库中 - 如果用户单击“保存”,则唯一发生的事情是列persistent设置为1。 现在,如果关闭了MDI子窗口,open设置为0 - 并且persistent=0 AND open=0的每一行都将注定失败并将被删除。

由于这种行为,我不需要问“保存文件?”在ApplicationClose上。
但是,每当MDI子窗口关闭时,我都需要询问 如果在Mainform.OnCloseQuery之前调用MDIChild.OnCloseQuery,那将很容易做到,但遗憾的是情况并非如此。

总结一下:
我需要一种方法来了解MDIChild.OnCloseQuery是否被调用,因为

  • 应用程序正在关闭,或
  • 正在关闭MDI子窗口。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:8)

您需要覆盖主窗体中受保护的虚拟方法CloseQuery。当它触发时你知道应用程序正在关闭。但是,在主窗体上触发CloseQuery事件之前,继承的实现会在MDI子项上调用OnCloseQuery

以下是TCustomForm的{​​{1}}实施:

CloseQuery

请注意,MDI儿童在function TCustomForm.CloseQuery: Boolean; var I: Integer; begin if FormStyle = fsMDIForm then begin Result := False; for I := 0 to MDIChildCount - 1 do if not MDIChildren[I].CloseQuery then Exit; end; Result := True; if Assigned(FOnCloseQuery) then FOnCloseQuery(Self, Result); end; 之前收到CloseQuery次通知,即主要表单。

所以在你的主要表格中你需要:

Self

然后是一个看起来像这样的实现:

type
  TMainForm = class(TForm);
  private
    FCloseQueryExecuting: Boolean;
  protected
    function CloseQuery: Boolean; override;
  public
    property CloseQueryExecuting: Boolean read FCloseQueryExecuting;
  end;

然后,MDI儿童可以在function TMainForm.CloseQuery: Boolean; begin FCloseQueryExecuting := True; try Result := inherited CloseQuery; finally FCloseQueryExecuting := False; end; end; 事件中检查主要表单的FCloseQueryExecuting属性的状态。