[dcc32错误] MSSQLQuery.pas(29):E2037“DataEvent”的声明与之前的声明不同
我做了一些研究,发现这个问题是在函数重写期间引起的,如果超类和子类中的声明不同
DataEvent是一个库函数,我已经检查了库,发现代码中的声明是正确的,但我不确定为什么会出现这种编译错误
我还确认此类中只有一个DataEvent函数
我是Delphi的新手所以请帮我解决这个错误
这是我定义的课程
TMSSQLQuery = Class (TADOQuery)
Private
FAutoNoLock : Boolean;
Protected
procedure DataEvent(Event: TDataEvent; Info: Longint); override;
Public
Constructor Create (AOwner : TComponent);Override;
Destructor Destroy;Override;
End;
这是程序定义
Procedure TMSSQLQuery.DataEvent(Event: TDataEvent; Info: Longint);
Begin
{ Call inherited method }
Inherited DataEvent (Event, Info);
If Event in [deConnectChange, dePropertyChange]
Then RefreshParams;
End;
答案 0 :(得分:2)
注意:在您最近的编辑之后,问题很明显。
您已使用第二个参数LongInt
声明了您的DataEvent处理程序:
procedure DataEvent(Event: TDataEvent; Info: Longint); override;
VCL将其定义为NativeInt
(请参阅documentation):
procedure DataEvent(Event: TDataEvent; Info: NativeInt); override;
NativeInt
和LongInt
在该声明中不相同,因此后代类定义与您尝试覆盖的祖先的定义不匹配。 (参见我的答案的下一部分)。
如果实现部分中的声明与接口声明不同,则会发生此错误。
type
TSomeClass=class(TSomething)
procedure DoThisThing(const AParameter: TSomeParamType);
end;
implementation
// Note difference in parameter name
procedure TSomeClass.DoThisThing(AParam: TSomeParamType);
begin
end;
// This would cause the same error - note the missing 'const'
procedure TSomeClass.DoThisThing(AParameter: TSomeParamType);
begin
end;
// This can cause the same error - note different param type
procedure TSomeClass.DoThisThing(AParameter: TDiffParamType);
解决问题的最简单方法是使用类完成为您编写实现定义。在interface
中键入声明,然后(仍然在该类定义中)使用 Ctrl + Shift + C 。它将为您在实现部分生成正确的方法存根。
(你可以同时生成几个;只需在使用击键组合之前声明它们。使用 Ctrl + Shift + UpArrow (或 DownArrow )可帮助您在实现和接口部分之间来回移动。)
文档(见下文)表明当您尝试覆盖虚方法时也会出现此错误消息,但覆盖方法具有不同的参数列表,调用约定等。此代码来自该链接文档:
type
MyClass = class
procedure Proc(Inx: Integer);
function Func: Integer;
procedure Load(const Name: string);
procedure Perform(Flag: Boolean);
constructor Create;
destructor Destroy(Msg: string); override; (*<-- Error message here*)
class function NewInstance: MyClass; override; (*<-- Error message here*)
end;
有关详细信息,请参阅E2037的Delphi文档。