Как использовать OnNotify универсального TList
Я хочу использовать событие OnNotify универсального TList. Назначение процедуры OnNotify дает сообщение об ошибке:
E2010 Incompatible types: 'System.Generics.Collections.TCollectionNotification' and 'System.Classes.TCollectionNotification'
Я объявляю класс, и в нем используется общий TList следующим образом:
TEditor_Table = class (TObject)
public
FEditors: TList<TGradient_Editor>; // List containing the editors
Это не самый аккуратный способ сделать это, но мне нужно это для теста. Экземпляр списка создается в конструкторе:
constructor TEditor_Table.Create (Owner: TFMXObject);
begin
inherited Create;
FEditors := TList<TGradient_Editor>.Create;
FOwner := Owner;
end; // Create //
далее в основной форме объявляется функция
procedure do_editor_change (Sender: TObject; const Item: TGradient_Editor; Action: TCollectionNotification);
и класс TColor_Editor создается следующим образом:
FColor_Editor := TEditor_Table.Create (List_Gradients);
FColor_Editor.FEditors.OnNotify := do_editor_change;
^
error occurs here----------------------------------+
Я вообще не понимаю сообщение, и я нахожусь в проигрыше, почему компилятор, кажется, путает две единицы: "система.Дженерик.Коллекции.TCollectionNotification " и " система.Занятия.TCollectionNotification'. Что я делаю не так?
1 ответов
проблема в том, что RTL определяет две разные версии TCollectionNotification
. Один в System.Classes
и один в Generics.Collections
.
вы используете TList<T>
С Generics.Collections
и так нужны TCollectionNotification
с Generics.Collections
. Но в вашем коде TCollectionNotification
является версией, объявленной в System.Classes
. Это потому, что в точке, где вы пишете TCollectionNotification
, System.Classes
после Generics.Collections
.
решения:
- измените порядок использования, чтобы
Generics.Collections
появляется послеSystem.Classes
. Это хорошая практика, несмотря ни на что. Или, - полностью укажите тип:
Generics.Collections.TCollectionNotification
.