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

时间:2018-02-21 07:23:18

标签: delphi vcl vcl-styles

我在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),此代码可以正常工作。

1 个答案:

答案 0 :(得分:7)

这完全是预料之中的。你的代码在没有VCL风格的情况下也是如此,但是你可以逃脱它。

问题是对Parent.Destroy的调用。当这些发生时,父节点将被销毁,其所有子节点也被销毁,包括拥有问题中所见代码的控件。当对Parent.Destroy的调用返回时,将继续执行已销毁的对象的方法。这是运行时错误的来源。

您需要在OnClose事件处理程序完成后安排销毁。出于此目的,存在VCL Release方法。