Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 更改类后尝试释放时导致错误的VCL组件_Delphi_Exception_Inheritance_Polymorphism_Delphi Xe - Fatal编程技术网

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

Delphi 更改类后尝试释放时导致错误的VCL组件,delphi,exception,inheritance,polymorphism,delphi-xe,Delphi,Exception,Inheritance,Polymorphism,Delphi Xe,我有一个应用程序,我在其中创建了一个从TPopupMenu(在vcl中创建)继承的弹出菜单类(比如tnewpoupmenu) 关于创建和更改类,请使用 Procedure T.ChangeClass; type PClass = ^TClass; Begin PClass(FEventPopup)^ := TNewPopupMenu; TNewPopupMenu(FEventPopup).OnDismissed := CallbackDismissPopUpMenu; End;

我有一个应用程序,我在其中创建了一个从TPopupMenu(在vcl中创建)继承的弹出菜单类(比如tnewpoupmenu)

关于创建和更改类,请使用

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时,我仍然遇到一个异常,我还需要做什么?

构造
PClass(FEventPopup)^:=TNewPopupMenu看起来很吓人。看起来您正在试图在运行时更改类类型,但这是不可能的

你想干什么?。如果要创建TNewPopupMenu类型的类,可以使用:

FEventPopup := TNewPopupMenu.Create(nil);
接下来,将FEventPopup定义为TNewPopupMenu。最好添加一个所有者,这样就不必担心破坏。不要忘记将弹出菜单指定给相应的控件

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

如果T是TForm或TForm子体,则可以在OnCreate中创建动态组件(并在OnDestroy中销毁它们)

最好不要用T作为类名,因为它不会给你任何关于它在做什么的线索


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

另请参见:如果您真的想在运行时更改类。我正在尝试使用多态性在运行时更改类,例如在C中,您可以使用TpopuMenu[]popUp=new TpopuMenu[]和popUp[1]=新的TNewPopUp。我面临的最大问题是,这些是Delphi no在运行时创建的VCL组件。请使用拦截器技术来实现这一点。