当节中的方法、函数或过程的声明与节中的声明不同时,编译器会抛出错误E2037 “%s”的声明与先前的声明不同。因此,对于那些在论坛上问这个问题的人,通常的建议是复制声明并粘贴,或者对类方法使用自动声明(默认为 Ctrl+Shift+C)。我一直认为这样的错误是一个简单的疏忽。implementationinterface
但是,我自己在自动声明后遇到了这个错误。编码:
type
TAgarozeGel = class
<...>
public
<...>
procedure HorizontalReflection(Bitmap: TBitmap);
end;
implementation
procedure TAgarozeGel.HorizontalReflection(Bitmap: TBitmap);
begin
<...>
end;
编译时出现此错误,即使 IDE 本身在实现部分中创建了该方法的描述。为什么?
放慢了 5 分钟后,我花在更改方法名称、各种复制等上,我意识到我需要深入挖掘并查看整个代码,而不仅仅是类代码。所以:
避免交叉引用和
interface只引用类型声明所需的模块的旧习惯在本节中起作用。正如@zed 在评论中指出的那样,重复出现的类型被重新定义为包含描述它们的模块。事实证明,TBitmap在方法声明中-来自模块Vcl.Graphics,在描述中-来自Winapi.Windows。关于编译器发誓的内容,但没有说明原因。解决方案:
将 Uses
Winapi.Windows移至部分interface。此外,它应该放在 之前Vcl.Graphics,以便TBitmap使用模块中的定义Vcl.Graphics。或者明确指出
TBitmap使用哪个模块。像这样:这是我认为最好的解决方案