0

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

4

1 回答 1

2

在您的程序中某处是一个声明抽象虚拟的类:

procedure Foo; virtual; abstract;

而你的程序实例化了一个不覆盖这个抽象方法的类,然后调用这个方法。调用此方法时,将引发 EAbstractError 异常。

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

Strings := TStrings.Create;

当你打算写

Strings := TStringList.Create;

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

对于许多类实例化模式,您的代码会导致编译器警告。编译器会警告您正在实例化一个包含抽象方法的类。如果您的错误如上所述,那么编译器警告将为您找到错误。我不能足够强调听取编译器警告的重要性。

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

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

于 2013-05-31T07:16:54.963 回答