Delphi 在FormCreate中调用虚函数

Delphi 在FormCreate中调用虚函数,delphi,Delphi,我正在玩一个已经存在的代码。我有一个基类表单,在这里我引入了一个虚拟函数并在FormCreate中调用该函数。在某些派生类中,我重写了该函数并有自己的实现。但是当我执行应用程序时,我得到了“EAbstract错误”。我不知道为什么我会得到这个例外。当我调试时,发现FormCreate对于某些表单执行得很好,但是对于其他一些表单,我遇到了这个异常。我是德尔福的新手,所以请忽略我的无知。谢谢。在您的程序中,有一个类声明了一个抽象的虚拟: procedure Foo; virtual; abstrac

我正在玩一个已经存在的代码。我有一个基类表单,在这里我引入了一个虚拟函数并在FormCreate中调用该函数。在某些派生类中,我重写了该函数并有自己的实现。但是当我执行应用程序时,我得到了“EAbstract错误”。我不知道为什么我会得到这个例外。当我调试时,发现FormCreate对于某些表单执行得很好,但是对于其他一些表单,我遇到了这个异常。我是德尔福的新手,所以请忽略我的无知。谢谢。

在您的程序中,有一个类声明了一个抽象的虚拟:

procedure Foo; virtual; abstract;
您的程序实例化一个不重写这个抽象方法的类,然后调用该方法。调用此方法时,将引发EAbstractError异常

抽象方法不一定在您编写的代码中声明。例如,您可能实例化了一个TStrings类:

Strings := TStrings.Create;
你打算什么时候写

Strings := TStringList.Create;
对TStrings实例的后续方法调用将导致抽象错误。请记住,TStrings是一个充满抽象方法的抽象类

对于许多类实例化模式,您的代码将导致编译器警告。编译器将警告您正在实例化包含抽象方法的类。如果您的错误如上所述,那么编译器警告将为您定位错误。我再怎么强调听编译器警告的重要性也不为过

但是,如果所讨论的抽象类是一个表单,那么如果您使用Application.CreateForm来实例化它,编译器将无法发出警告


如果您的代码声明了abstract方法,那么您可以通过搜索(在文件中查找)abstract的用法来轻松找到问题。如果这没有帮助,并且没有编译器警告,然后将调试器配置为在异常时中断,然后在程序在异常时中断时查看调用堆栈。

您必须错过重写该抽象方法,因为调用抽象方法时会引发
EAbstractError
。或者您使用了
继承的myFunction
,而您不应该这样做(你称之为阿切斯特的抽象方法)@TLama:不,它不是一个抽象方法,它只是一个虚拟函数。有人试图在函数或重写中创建一个抽象类?@Jeeva,如果它只是虚拟的,即使该虚拟方法为空,或者在抽象方法类的de中调用
inherited
,也不会得到
EAbstractError
scendant.bummi的注释可能是原因。在我引入这个虚拟函数之前,这个类工作得很好,我没有使用抽象。如果我删除这个函数并覆盖它,我的应用程序工作得很好。因为它是一个非常大的代码库,我发现很难确定根本原因。我已经描述了导致EAbstractError的原因。很明显,你被调用了使用一个抽象方法。然后使用调试器。如果您无法使用调试器解决问题,请创建一个小而完整的程序来说明问题。哦,这是一个完全的混乱。我重新启动了系统,一切都很好,很明显代码发生了更改。但是失败的版本,原因如上所述。