Я добавляю это как ответ здесь, потому что это очень похожая проблема, но я просто столкнулся с этим в блоке, который выглядит так:
unit Unit1;
interface
uses Generics.Collections;
type
TFoo = class
end;
TFooList = class(TObjectList<TFoo>)
protected
procedure Notify(const Item: TFoo; Action: TCollectionNotification); override;
end;
implementation
uses Classes;
procedure TFooList.Notify(const Item: TFoo; Action: TCollectionNotification);
var
sl : TStringList;
begin
//
end;
end.
[Ошибка dcc32] Unit1.pas (20): E2037 Декларация «Уведомить» отличается от предыдущей декларации
[Ошибка dcc32] Unit1.pas (12): E2065 Неудовлетворенное прямое или внешнее объявление: 'TFooList.Notify'
[dcc32 Фатальная ошибка] Project1.dpr (6): F2063 Не удалось скомпилировать использованный модуль 'Unit1.pas'
Мне потребовалось больше времени, чем я хотел бы признаться, чтобы понять, что есть
System.Classes :: TCollectionNotification = (cnAdded, cnExtracting, cnDeleting);
и a:
System.Generics.Collections :: TCollectionNotification = (cnAdded, cnRemoved, cnExtracted);
Урок заключается в методической проверке ваших типов. Ctrl + CLICK на идентификаторе типа приведет вас к определению типа, используемого компилятором. Чтобы это исправить, реорганизуйте предложения uses
или используйте полное имя типа.
Достаточно плохо, когда совершают ошибку новичка при дублировании имен типов в нашем собственном коде, вдвойне плохо, когда Emba делает это в своих собственных RTL.