Как использовать 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.

решения:

  1. измените порядок использования, чтобы Generics.Collections появляется после System.Classes. Это хорошая практика, несмотря ни на что. Или,
  2. полностью укажите тип:Generics.Collections.TCollectionNotification.