使用 VCL 主题在 FormClose 中获取访问冲突错误

Getting access violation error in FormClose using VCL Themes

我在使用 VCL 主题的 VCL 中开发了一个应用程序。此应用程序需要 TPageControl 和内部(子)表单。

每个子窗体在 OnClose 中的方式相同:Parent.Destroy;

 MsgResp := MessageDlg('Closing info....', mtWarning, [mbYes, mbNo, mbCancel], 0);
  case MsgResp of
    mrYes:
      begin
        DoSomething; {Save something}
        Parent.Destroy;
      end; 
    mrNo:
      begin
        Parent.Destroy;
      end;
    mrCancel:
      begin
        Exit;
      end;
 end;

如果我将主题设置为像 Sapphire Kamri(或其他东西)这样的应用程序,我会在销毁父组件时遇到访问冲突错误。但是,如果我使用默认样式 (Windows),则此代码可以正常工作。

这完全可以预料。如果没有 VCL 样式,您的代码同样会损坏,但您可以摆脱它。

问题是对 Parent.Destroy 的调用。当这些发生时,父级被销毁,它的所有子级也被销毁,包括拥有问题中看到的代码的控件。当调用 Parent.Destroy returns 时,在已销毁对象的方法中继续执行。这就是运行时错误的根源。

您需要安排销毁在 OnClose 事件处理程序完成后发生。 VCL Release 方法就是为了这个目的而存在的。