我目前正在开发MDI应用程序。
每次创建新的MDI子窗口时,它的基础数据都会即时保存到SQLite数据库中,并且open列设置为1,因此,如果用户关闭程序并重新打开它,则将还原窗口(以防万一of Anything BadTM)。
因此,每个文档始终存在于数据库中-如果用户单击“保存”,唯一发生的事情是将persistent列设置为1
现在,如果关闭了MDI子窗口,则open设置为0-带有persistent=0 AND open=0的每一行都注定要被删除。

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

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

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

  • 有什么办法吗?

    最佳答案

    您需要在主表单中覆盖 protected 虚拟方法CloseQuery。当发生这种情况时,您就知道该应用程序正在关闭。但是继承的实现会在触发主窗体上的CloseQuery事件之前,先在MDI子级上调用OnCloseQuery

    这是TCustomFormCloseQuery实现:

    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;
    

    请注意,MDI子级在获得CloseQuery之前即其主表单之前获得了Self通知。

    因此,在您的主要形式中,您需要:
    type
      TMainForm = class(TForm);
      private
        FCloseQueryExecuting: Boolean;
      protected
        function CloseQuery: Boolean; override;
      public
        property CloseQueryExecuting: Boolean read FCloseQueryExecuting;
      end;
    

    然后是一个如下所示的实现:
    function TMainForm.CloseQuery: Boolean;
    begin
      FCloseQueryExecuting := True;
      try
        Result := inherited CloseQuery;
      finally
        FCloseQueryExecuting := False;
      end;
    end;
    

    然后,MDI子级可以在其FCloseQueryExecuting事件中检查主表单的OnCloseQuery属性的状态。

    关于delphi - 如何知道为什么调用 'OnCloseQuery'-MDI子级关闭或应用程序关闭?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14054551/

    10-12 00:42