类更改后尝试释放时VCL组件导致错误

时间:2014-02-19 04:03:20

标签: delphi exception inheritance polymorphism delphi-xe

我有一个应用程序,我创建一个从TPopupMenu继承的Popup菜单类(比如说TNewPopupMenu)(在vcl中创建)

使用

创建更改班级
Procedure T.ChangeClass;
type
  PClass = ^TClass;

Begin
  PClass(FEventPopup)^ := TNewPopupMenu;
  TNewPopupMenu(FEventPopup).OnDismissed := CallbackDismissPopUpMenu;
End;

如果我这样离开,当应用程序关闭并尝试释放FEventPopup时会出现错误,我尝试这样做以解决:

destructor T.Destroy;
type
  PClass = ^TClass;
begin
  TNewPopupMenu(FEventPopup).OnDismissed := nil;
  PClass(FEventPopup)^ := TPopupMenu;
  inherited;
end;

但是当主窗体尝试释放FEventPopup时,我仍然会遇到异常,我还需要做什么?

1 个答案:

答案 0 :(得分:2)

构造PClass(FEventPopup)^ := TNewPopupMenu;看起来很吓人。看起来你在运行时更改类类型并且这是不可能的。

你打算做什么?如果要创建类型为TNewPopupMenu的类,可以使用:

FEventPopup := TNewPopupMenu.Create(nil);

接下来将FEventPopup定义为TNewPopupMenu。最好添加一个所有者,这样您就不必担心破坏了。不要忘记将弹出菜单分配给适当的控件。

您不需要PClass(FEventPopup)^ := TPopupMenu;

如果T是TForm或TForm后代,您可以在OnCreate中创建动态组件(并在OnDestroy中销毁它们。

最好不要将T用作类名。它不会让你知道它在做什么。

此外,如果您真的想使用自定义组件,为什么不将它放在一个包中并注册它,以便您可以在表单编辑器中使用它。