TCollectionNotification

TCollectionNotification

我想使用通用TList的OnNotify事件。将过程分配给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----------------------------------+

我完全不理解该消息,我不知道为什么编译器似乎混淆了两个单元:“System.Generics.Collections.TCollectionNotification”和“System.Classes.TCollectionNotification”。我究竟做错了什么?

最佳答案

问题是RTL定义了TCollectionNotification的两个不同版本。一种在System.Classes中,另一种在Generics.Collections中。

您正在使用TList<T>中的Generics.Collections,因此需要TCollectionNotification中的Generics.Collections。但是在您的代码中TCollectionNotificationSystem.Classes中声明的版本。这是因为,在您编写TCollectionNotification时,在System.Classes之后使用了Generics.Collections

解决方案是:

  • 更改使用顺序,以便Generics.Collections出现在System.Classes之后。无论如何,这都是一个好习惯。或者,
  • 完全指定类型:Generics.Collections.TCollectionNotification
  • 09-19 06:37