【问题标题】:Getting access violation error in FormClose using VCL Themes使用 VCL 主题在 FormClose 中获取访问冲突错误
【发布时间】:2018-02-21 07:23:18
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,我们很少在Self 以外的对象上调用Destroy。相反,我们使用Free,它首先检查主题是否不是nil

标签: delphi vcl vcl-styles


【解决方案1】:

这完全在意料之中。您的代码在没有 VCL 样式的情况下同样被破坏,但您可以摆脱它。

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

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

【讨论】:

  • 据我了解,我不应该将Destroy 用于SelfParent。最好的销毁时间表是什么?
  • 如果父级是表单可以使用Release,否则使用stackoverflow.com/a/2502613/505088实现自己
  • 我应该为我的父控件处理Release。感谢您的帮助。
猜你喜欢
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多