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

person tej    schedule 05.03.2014    source источник
comment
1) Вы уверены, что файл MSSQLQuery.pas или связанный с ним файл не изменен? 2) Вы уверены, что нет другого MSSQLQuery 3) Вы пытались закрыть среду разработки Delphi и перезапустить ее? (часто становится нестабильным). 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);

Самое простое решение проблемы — использовать автодополнение классов, чтобы написать определение реализации за вас. Введите объявление в 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