Грешка при компилация в Delphi XE4

[dcc32 Error] 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;

person tej    schedule 05.03.2014    source източник
comment
1) Сигурни ли сте, че MSSQLQuery.pas или свързан файл не е променен? 2) Сигурни ли сте, че няма друг MSSQLQuery 3) Опитвали ли сте да затворите delphi IDE и да рестартирате? (често става нестабилен). 4) Можете ли да публикувате кода на декларацията на DataEvent и неговия предшественик.   -  person Toon Krijthe    schedule 05.03.2014
comment
Моля, редактирайте, за да включите действителния кодов ред (ред 29), който причинява грешката на компилатора.   -  person Ken White    schedule 06.03.2014
comment
Добавих кода във въпроса   -  person tej    schedule 06.03.2014
comment
Вече обясних защо се случва това. Вижте моя редактиран отговор.   -  person Ken White    schedule 06.03.2014


Отговори (1)


Забележка: След скорошната ви редакция проблемът е ясен.

Вие сте декларирали своя манипулатор на DataEvent с втори параметър от LongInt:

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

VCL го дефинира като NativeInt (вижте документацията):

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

Най-лесното решение на проблема е да използвате Class Completion, за да напишете дефиницията за изпълнение вместо вас. Въведете декларацията в interface и след това (докато все още сте в тази дефиниция на клас) използвайте Ctrl+Shift+C. Той ще генерира правилния метод за вас в секцията за внедряване.

(Можете да генерирате няколко едновременно; просто ги декларирайте всички, преди да използвате комбинацията от клавиши. Използвайки Ctrl+Shift+Стрелка нагоре (или < kbd>Стрелка надолу) ви помага да се движите напред и назад между секциите за внедряване и интерфейс.)

Документацията (вижте по-долу) показва, че това съобщение за грешка се появява и когато се опитате да замените виртуален метод, но заместващият метод има различен списък с параметри, конвенция за извикване и т.н. Този код е от тази свързана документация:

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;

За повече информация вижте документацията на Delphi за E2037.

person Ken White    schedule 06.03.2014