我有一个MDI应用程序,我有一个MDI孩子做一些处理(需要10-20秒完成).我发现如果我关闭主应用程序,它会崩溃,因为MDI子项提前关闭(在完成处理之前).
代码是这样的(将所有代码放在这里太复杂了):
mainForm.OnButtonClick
begin
start data processing; <--- 10 seconds
create MDI child; <--- instant
create visual controls (runtime) <==
display the processed data in MDI child; <== 1 sec
end;
Run Code Online (Sandbox Code Playgroud)
该程序在第3行崩溃.FastMM说"FastMM已经检测到尝试在释放的对象上调用虚方法".显然,MDI孩子已被释放.
怎么预防这个?
在MDI子窗口中,执行
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := not IsWorking;
end;
Run Code Online (Sandbox Code Playgroud)
并做
mainForm.OnButtonClick
begin
IsWorking := true;
try
start data processing; <--- 10 seconds
create MDI child; <--- instant
create visual controls (runtime) <==
display the processed data in MDI child; <== 1 sec
finally
IsWorking := false;
end;
end;
Run Code Online (Sandbox Code Playgroud)