5

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

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

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

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

有没有办法做到这一点?

4

1 回答 1

9

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

这里是TCustomForm实现CloseQuery

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

于 2012-12-27T12:30:04.743 回答