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