我有一个应用程序,我创建一个从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时,我仍然会遇到异常,我还需要做什么?
答案 0 :(得分:2)
构造PClass(FEventPopup)^ := TNewPopupMenu;
看起来很吓人。看起来你在运行时更改类类型并且这是不可能的。
FEventPopup := TNewPopupMenu.Create(nil);
接下来将FEventPopup定义为TNewPopupMenu。最好添加一个所有者,这样您就不必担心破坏了。不要忘记将弹出菜单分配给适当的控件。
您不需要PClass(FEventPopup)^ := TPopupMenu;
。
如果T是TForm或TForm后代,您可以在OnCreate中创建动态组件(并在OnDestroy中销毁它们。
最好不要将T用作类名。它不会让你知道它在做什么。
此外,如果您真的想使用自定义组件,为什么不将它放在一个包中并注册它,以便您可以在表单编辑器中使用它。