我目前正在开发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
,因为
有什么办法吗?
最佳答案
您需要在主表单中覆盖 protected 虚拟方法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
属性的状态。关于delphi - 如何知道为什么调用 'OnCloseQuery'-MDI子级关闭或应用程序关闭?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14054551/