我目前正在开发MDI应用程序
每次创建新的MDI子窗口时,它的基础数据都会动态保存到SQLite数据库,而open
列设置为1
,因此如果用户关闭程序并重新打开它,窗户恢复(也是在任何不良 TM 的情况下)
因此,每个文档始终存在于数据库中 - 如果用户单击“保存”,则唯一发生的事情是列persistent
设置为1
。
现在,如果关闭了MDI子窗口,open
设置为0
- 并且persistent=0 AND open=0
的每一行都将注定失败并将被删除。
由于这种行为,我不需要问“保存文件?”在ApplicationClose上。
但是,每当MDI子窗口关闭时,我做都需要询问
如果在Mainform.OnCloseQuery
之前调用MDIChild.OnCloseQuery
,那将很容易做到,但遗憾的是情况并非如此。
总结一下:
我需要一种方法来了解MDIChild.OnCloseQuery
是否被调用,因为
有没有办法做到这一点?
答案 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
属性的状态。