如何防止在应用程序完成处理之前关闭MDI窗口

WeG*_*ars 0 delphi

我有一个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孩子已被释放.

怎么预防这个?

And*_*and 5

在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)

  • 在FormCloseQuery中,您应该注意用户已请求关闭,然后通过在工作完成时关闭来响应此操作.理想情况下,人们可以取消工作,以便在用户请求时立即关闭. (2认同)