我在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),此代码可以正常工作。
答案 0 :(得分:7)
这完全是预料之中的。你的代码在没有VCL风格的情况下也是如此,但是你可以逃脱它。
问题是对Parent.Destroy
的调用。当这些发生时,父节点将被销毁,其所有子节点也被销毁,包括拥有问题中所见代码的控件。当对Parent.Destroy
的调用返回时,将继续执行已销毁的对象的方法。这是运行时错误的来源。
您需要在OnClose
事件处理程序完成后安排销毁。出于此目的,存在VCL Release
方法。