gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:07:41 25 4
gpt4 key购买 nike

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

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

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

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

有什么办法可以做到这一点吗?

最佳答案

您需要在主窗体中重写 protected 虚拟方法CloseQuery。当它触发时,您就知道该应用程序正在崩溃。但继承的实现会在主窗体上触发 OnCloseQuery 事件之前调用 MDI 子级上的 CloseQuery

这是 CloseQueryTCustomForm 实现:

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 子项会先于 Self(即主窗体)获取 CloseQuery 通知。

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

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 子级可以在其 OnCloseQuery 事件中检查主窗体的 FCloseQueryExecuting 属性的状态。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com