我有一个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;
程序在第3行崩溃。 FastMM说“FastMM已经检测到尝试在释放的对象上调用虚方法”。显然MDI孩子已被释放。
如何防止这种情况?
答案 0 :(得分:5)
在您的MDI子窗口中,执行
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := not IsWorking;
end;
并做
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;