Ошибка компиляции в 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 ответ

Решение

Примечание. После недавнего редактирования проблема устранена.

Вы объявили свой обработчик 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+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;

Для получения дополнительной информации см. Документацию Delphi для E2037.

Другие вопросы по тегам