我正在使用已有的代码。我有一个基类形式,我引入一个虚函数并在FormCreate中调用该函数。在一些派生类中,我重写函数并拥有自己的实现。但是当我执行应用程序时,我得到“EAbstract错误”。我不知道为什么我得到这个例外。当我调试它是FormCreate正在执行一些形式,但对于其他一些形式我得到这个例外。我是德尔福的新手,所以忽略了我的无知。感谢。
答案 0 :(得分:2)
程序中的某个地方是一个声明抽象虚拟的类:
procedure Foo; virtual; abstract;
并且您的程序实例化一个不覆盖此抽象方法的类,然后调用该方法。调用此方法时,将引发EAbstractError异常。
抽象方法不一定在您编写的代码中声明。例如,您可能实例化了一个TStrings类:
Strings := TStrings.Create;
当你打算写
时Strings := TStringList.Create;
对TStrings实例的后续方法调用将导致抽象错误。请记住,TStrings是一个充满抽象方法的抽象类。
对于许多类实例化模式,您的代码会导致编译器警告。编译器将警告您正在实例化包含抽象方法的类。如果您的错误如上所述,则编译器警告将为您找到错误。我不能强调听取编译器警告的重要性。
但是,如果有问题的抽象类是一个表单,那么如果您使用Application.CreateForm来实例化它,编译器将无法发出警告。
如果您的代码声明了抽象方法,那么您可以通过执行搜索(在文件中查找)来使用抽象来轻松找到问题。如果这没有帮助,并且没有编译器警告,那么配置调试器以中断异常,然后在程序中断异常时查看调用堆栈。