使用 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
方法就是为了这个目的而存在的。
我在使用 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
方法就是为了这个目的而存在的。