【问题标题】:Compilation error in Delphi XE4Delphi XE4中的编译错误
【发布时间】:2014-04-07 10:57:41
【问题描述】:

[dcc32 错误] MSSQLQuery.pas(29):“DataEvent”的 E2037 声明与之前的声明不同

我做了一些研究,发现这个问题是在函数覆盖过程中引起的,如果超类和子类中的声明不同

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) 您确定 MSSQLQuery.pas 或相关文件未更改吗? 2)你确定没有其他MSSQLQuery 3)你试过关闭delphi IDE并重新启动吗? (它经常变得不稳定)。 4) 能否贴出DataEvent及其祖先的声明代码。
  • edit 包含导致编译器错误的实际代码行(第 29 行)。
  • 我已经在问题中添加了代码
  • 我已经解释了为什么会这样。请参阅我编辑的答案。

标签: delphi delphi-xe4


【解决方案1】:

注意:在您最近的编辑之后,问题就很清楚了。

您已经使用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);

解决问题最简单的方法是使用 Class Completion 为您编写实现定义。在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 文档。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2013-11-04
    相关资源
    最近更新 更多