Delphi XE4中的编译错误

时间:2014-03-05 11:47:04

标签: delphi delphi-xe4

[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;

1 个答案:

答案 0 :(得分:2)

注意:在您最近的编辑之后,问题很明显。

您已使用第二个参数LongInt声明了您的DataEvent处理程序:

procedure DataEvent(Event: TDataEvent; Info: Longint); override;

VCL将其定义为NativeInt(请参阅documentation):

procedure DataEvent(Event: TDataEvent; Info: NativeInt); override;

NativeIntLongInt在该声明中不相同,因此后代类定义与您尝试覆盖的祖先的定义不匹配。 (参见我的答案的下一部分)。

如果实现部分中的声明与接口声明不同,则会发生此错误。

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文档。